# include <graphics.h>
# include <conio.h>
# include <stdio.h>
# include <stdlib.h>
# define MAX 200
void main (void)
{
int gest=VGA,
mode=VGAHI,
erreur,couleur,
xdr,xfr,ydr,yfr,
i,j,k,m;
float aa,bb,cc;
double x,y,xc,yc,xold,yold,xd,xf,yd,yf,d,dx,dy;
char c,c1,c2;
unsigned taille;
void *tampon;
struct palettetype pal;
puts("Entrez trois nombres :");
puts("Ils définiront la tendance (printemps-été 98!) de votre palette.");
puts("Ces valeurs codent en fait les rapports entre le rouge, le vert et le bleu.");
puts("\nExemple : 3 3 3 vous donnera une palette de gris très bien dégradée mais");
puts("l'écran ne sera pas très lumineux car tous ces gris sont proches du noir...");
puts("\n30 30 30 permet plus de contraste, tout en restant dans les gris.\t\t");
scanf("%f%f%f",&aa,&bb,&cc);
initgraph(&gest,&mode,"c:\\tc\\bgi");
if ((erreur=graphresult())!=grOk)
{
printf("Erreur graphique : %s\n",grapherrormsg(erreur));
getch();
exit(1);
}
getpalette(&pal);
for (i=0; i<pal.size; i++)
setrgbpalette(pal.colors[i], i*aa, i*bb, i*cc);
xd=-2.0;
xf=1.0;
yd=-1.0;
yf=1.0;
d=0;
m=MAX;
do
{
for (i=0;i<640;i++)
{
for (j=0;j<480;j++)
{
putpixel(i,j,15);
xc=xold=xd+(xf-xd)/640.0*i;
yc=yold=yd+(yf-yd)/480.0*j;
k=0;
do
{
x=xold*xold-yold*yold+xc;
y=2.0*xold*yold+yc;
d=x*x+y*y;
k++;
xold=x;
yold=y;
}while ((k<MAX)&&(d<4.0));
if (k==m)
{
do d*=2.0;
while ((d<16.0)||(d==0.0));
couleur=0;
}
else
couleur=k%16;
putpixel(i,j,couleur);
}
if (kbhit())
{
getch();
break;
}
}
getch();
setwritemode(XOR_PUT);
xdr=220;
xfr=420;
ydr=165;
yfr=315;
setcolor(15);
rectangle(xdr,ydr,xfr,yfr);
do
{ c1=getch();
c2=0;
if (c1)
switch (c1)
{
case '+':
if (xfr>635)break;
if (xdr<4) break;
if (yfr>476) break;
if (ydr<3) break;
rectangle(xdr,ydr,xfr,yfr);
xfr+=4;
xdr-=4;
xfr+=3;
ydr-=3;
rectangle(xdr,ydr,xfr,yfr);
break;
case '-':
if ((xfr-xdr)<9) break;
if ((yfr-ydr)<7) break;
rectangle(xdr,ydr,xfr,yfr);
xfr-=4;
xdr+=4;
yfr-=3;
ydr+=3;
rectangle(xdr,ydr,xfr,yfr);
break;
}
else
c2=getch();
switch (c2)
{
case 77 :
if (xfr==639) break;
rectangle(xdr,ydr,xfr,yfr);
xfr++;
xdr++;
rectangle(xdr,ydr,xfr,yfr);
break;
case 75 :
if (xdr==0) break;
rectangle(xdr,ydr,xfr,yfr);
xfr--;
xdr--;
rectangle(xdr,ydr,xfr,yfr);
break;
case 80 :
if (yfr==479) break;
rectangle(xdr,ydr,xfr,yfr);
yfr++;
ydr++;
rectangle(xdr,ydr,xfr,yfr);
break;
case 72 :
if (ydr==0) break;
rectangle(xdr,ydr,xfr,yfr);
yfr--;
ydr--;
rectangle(xdr,ydr,xfr,yfr);
break;
}
} while ((c1!=13)&&(c1!=27));
setwritemode(COPY_PUT);
rectangle(xdr,ydr,xfr,yfr);
setwritemode(XOR_PUT);
dx=xd;
dy=yd;
xd=xd+(xf-xd)*xdr/640.0;
xf=dx+(xf-dx)*xfr/640.0;
yd=yd+(yf-yd)*ydr/480.0;
yf=dy+(yf-dy)*yfr/480.0;
m*=2;
taille=imagesize(xdr,ydr,xfr,yfr);
if (taille<60000)
{
tampon=malloc(taille);
getimage(xdr,ydr,xfr,yfr,tampon);
cleardevice();
putimage(640-(xfr-xdr)-1,480-(yfr-ydr)-1,tampon,0);
free(tampon);
}
else
cleardevice();
}while (c1!=27);
closegraph();
}