/*************************************************************************************************************************************/ /* */ /* T E S T D E L A C O N S T R U C T I O N D ' U N E C O U R B E D E V O N K O C H */ /* D A N S L E C A D R E D U M O O C S U R L A G E O M E T R I E F R A C T A L E : */ /* */ /* */ /* Author of '$xtc/VonKoch.11$c' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, AAAAMMJJhhmmss). */ /* */ /*************************************************************************************************************************************/ #include "INCLUDES.01.I" /* Introduit le 20051116095530... */ extern void *malloc(); extern double sqrt(); extern double cos(); extern double sin(); static int dimX=0; #define Xmin 0 #define Xmax (Xmin + (dimX-1)) /* Definition des abscisses. */ static int dimY=0; #define Ymin 0 #define Ymax (Ymin + (dimY-1)) /* Definition des ordonnees. */ #define Xnormalise(x) \ ((int)((x-XG)/(XD-XG)*dimX)) #define Ynormalise(y) \ ((int)((y-YB)/(YH-YB)*dimY)) #define IMAGE(x,y) \ (*(image + ((int)(((y-Ymin)*dimX) + (x-Xmin))))) \ /* Acces a un point de l'image. */ #define store(n,x,y) \ { \ if (((x>=Xmin) && (x<=Xmax)) && ((y>=Ymin) && (y<=Ymax))) \ { \ IMAGE(x,y) = n; \ } \ else \ { \ } \ } \ /* Rangement d'un point valide d'une image. */ #define XG (0.00) #define XD (1.00) /* Extremites Gauche et Droite sur l'axe des 'X'. */ #define YB (0.00) #define YH (1.00) /* Extremites Bas et Haut sur l'axe des 'Y'. */ typedef struct complexe { double reelle; double imaginaire; } complexe; /* 'struct' de definition d'un nombre complexe... */ #define Reelle(z) (z.reelle) #define Imaginaire(z) (z.imaginaire) #define Cinit(z,x1,y1) \ { \ Reelle(z) = x1; \ Imaginaire(z) = y1; \ } #define Cegal(z,z1) \ { \ Cinit(z,Reelle(z1),Imaginaire(z1)); \ } #define Csomme(z,z1,z2) \ { \ complexe zT; \ Reelle(zT) = Reelle(z1) + Reelle(z2); \ Imaginaire(zT) = Imaginaire(z1) + Imaginaire(z2); \ Cegal(z,zT); \ } #define Cdifference(z,z1,z2) \ { \ complexe zT; \ Reelle(zT) = Reelle(z1) - Reelle(z2); \ Imaginaire(zT) = Imaginaire(z1) - Imaginaire(z2); \ Cegal(z,zT); \ } #define Cproduit(z,z1,z2) \ { \ complexe zT; \ Reelle(zT) = (Reelle(z1)*Reelle(z2)) - (Imaginaire(z1)*Imaginaire(z2)); \ Imaginaire(zT) = (Reelle(z2)*Imaginaire(z1)) + (Reelle(z1)*Imaginaire(z2)); \ Cegal(z,zT); \ } #define Crotation(z,z1,rho,theta) \ { \ complexe zR; \ Cinit(zR,rho*cos(theta),rho*sin(theta)); \ Cproduit(z,z1,zR); \ } #define Cmodule2(z) \ ((Reelle(z)*Reelle(z)) + (Imaginaire(z)*Imaginaire(z))) unsigned char *image; /* Definition de l'image a generer... */ double seuil=0.002; /* Definition du seuil d'arret. */ double angle=PI/3.0; double rapport=3.0; #define HAUTEUR \ sin(angle)/rapport #define MILIEU \ 2 /* Definition de la transformation... */ construction(Az,Ez) complexe Az,Ez; { double Ax=Reelle(Az),Ay=Imaginaire(Az); double Ex=Reelle(Ez),Ey=Imaginaire(Ez); complexe difference; Cdifference(difference,Ez,Az); if (sqrt(Cmodule2(difference)) < seuil) { store(BLANC,Xnormalise(Reelle(Az)),Ynormalise(Imaginaire(Az))); store(BLANC,Xnormalise(Reelle(Ez)),Ynormalise(Imaginaire(Ez))); /* Marquage et arret de la recursivite... */ } else { double Bx,By; complexe Bz; double Cx,Cy; complexe Cz; double Hx=(Ex+Ax)/MILIEU,Hy=(Ey+Ay)/MILIEU; double AEx_reduit=(Ex-Ax)/rapport,AEy_reduit=(Ey-Ay)/rapport; double HCx=(Ey-Ay)*HAUTEUR,HCy=(Ex-Ax)*HAUTEUR; double Dx,Dy; complexe Dz; Bx = Ax + AEx_reduit; By = Ay + AEy_reduit; Cx = Hx - HCx; Cy = Hy + HCy; Dx = Ex - AEx_reduit; Dy = Ey - AEy_reduit; Cinit(Bz,Bx,By); Cinit(Cz,Cx,Cy); Cinit(Dz,Dx,Dy); construction(Az,Bz); construction(Bz,Cz); construction(Cz,Dz); construction(Dz,Ez); } return(OK); } main() { complexe Az,Ez; /* Definition des extremites de la courbe. */ int x,y; /* Definition des coordonnees d'initialisation de l'image. */ Get(dimX,"dimX"); Get(dimY,"dimY"); /* Recuperation des dimensions en 'X' et en 'Y' de l'image a generer. */ image=malloc(dimY*dimX); /* Definition de l'image a generer... */ for (y=Ymin ; y<=Ymax ; y++) { for (x=Xmin ; x<=Xmax ; x++) { store(NOIR,x,y); /* Initialisation de l'image finale... */ } } Cinit(Az,XG,(YB+YH)/2); Cinit(Ez,XD,(YB+YH)/2); /* Initialisation des extremites de la courbe. */ construction(Az,Ez); /* Construction de la courbe. */ write(1,image,dimX*dimY); /* Sortie de l'image... */ }