/*************************************************************************************************************************************/ /* */ /* G E N E R A T I O N D ' U N E I M A G E C O N T E N A N T L ' A T T R A C T E U R D E H E N O N */ /* A V E C T E S T D E L ' A S S O C I A T I V I T E D E L A M U L T I P L I C A T I O N : */ /* */ /* */ /* Std */ /* $aPout | $xci/display$X p=$xiP/cercle.22 */ /* */ /* */ /* Author of '$xtc/henon.02$c' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, AAAAMMJJhhmmss). */ /* */ /*************************************************************************************************************************************/ #include <stdio.h> #include <fcntl.h> #define PRECIS double \ /* Permet de travailler en 'double' ou en 'float'. */ #define pas 10 #define N 10 /* Nombre d'iterations... */ #define Tx 1.3 #define Ty 1.275 #define echelle 0.40 /* Translation et echelle des valeurs des deux suites. Ces constantes sont calculees suivant */ /* la methode suivante : */ /* */ /* 1 \ */ /* echelle = ----------- | */ /* MXn - mXn | de facon a placer l'abscisse de */ /* | l'origine au centre de l'image. */ /* | */ /* Tx = -mXn / */ /* */ /* echelle*(0.0 + Ty) = 0.5 (c'est-a-dire l'ordonnee du milieu de l'image dans [0,1]) */ /* . */ /* /|\ | */ /* | ordonnee de l'origine | */ /* |_____________________________________________| */ /* */ /* */ #define dimX 512 #define Xmin 0 #define Xmax (Xmin + (dimX-1)) #define Cx(x) ((int)(Xmin + ((echelle*((x+Tx)))*(Xmax-Xmin)))) /* Definition des abscisses et de la fonction de passage de [0,1] a [Xmin,Xmax]. */ #define dimY 512 #define Ymin 0 #define Ymax (Ymin + (dimY-1)) #define Cy(y) ((int)(Ymin + ((echelle*((y+Ty)))*(Ymax-Ymin)))) /* Definition des ordonnees et de la fonction de passage de [0,1] a [Ymin,Ymax]. */ #define IMAGE(x,y) \ image[y][x] \ /* Acces a un point de l'image. */ #define store(n,x,y) \ { \ if ((((Cx(x)) >= Xmin) && (Cx(x) <= Xmax)) && ((Cy(y) >= Ymin) && (Cy(y) <= Ymax))) \ { \ IMAGE(Cx(x),Cy(y)) = n; \ } \ else \ { \ } \ } \ /* Rangement d'un point valide d'une image. */ #define A 1.0 #define B 1.4 #define C 0.3 /* L'attracteur de Henon est defini par l'iteration : */ /* */ /* 2 */ /* X = A + Y - B.X */ /* n+1 n n */ /* */ /* */ /* Y = C.X */ /* n+1 n */ /* */ #define X0 0.00 #define Y0 0.00 #define niveau1 72 #define niveau2 145 main() { PRECIS Xn1=X0,Yn1=Y0; PRECIS sXn1,sYn1; PRECIS Xn2=X0,Yn2=Y0; PRECIS sXn2,sYn2; /* Definition des deux formulations du couple (Xn,Yn). */ int n; /* Definition de l'index d'iteration. */ int x,y; /* Definition des coordonnees. */ unsigned char image[dimY][dimX]; /* Definition de l'image a generer... */ for (y=Ymin ; y<=Ymax ; y++) { for (x=Xmin ; x<=Xmax ; x++) { IMAGE(x,y) = 0; } } /* Nettoyage de l'image... */ for (n=0 ; n<(N*pas) ; n++) { if ((n%pas) == 0) { fprintf(stderr,"\n X1(%3d) = %18.14g",n,Xn1); fprintf(stderr," Y1(%3d) = %18.14g",n,Yn1); fprintf(stderr," X2(%3d) = %18.14g",n,Xn2); fprintf(stderr," Y2(%3d) = %18.14g",n,Yn2); } else { } store(niveau1,Xn1,Yn1); store(niveau2,Xn2,Yn2); /* Generation de l'image point par point... */ sXn1 = A + Yn1 - (B*(Xn1*Xn1)); sYn1 = C*Xn1; Xn1 = sXn1; Yn1 = sYn1; sXn2 = A + Yn2 - (Xn2*(B*Xn2)); sYn2 = C*Xn2; Xn2 = sXn2; Yn2 = sYn2; /* Iteration... */ } write(1,image,dimX*dimY); /* Sortie de l'image... */ }