/*----------------------------------------------------------*/ /* */ /* AUTHOR : Eric VIOLARD */ /* E-MAIL : violard@icps.u-strasbg.fr */ /* ORGANISM : Université Louis Pasteur (Strasbourg) */ /* CREATION : 02/01/03 */ /* */ /* ---------------------------------------------------------*/ /* Programme qui dessine le flocon de von Koch d'ordre n. On utilise les fonctions trigonométriques sin et cos de la bibliothèque des fonctions mathématiques. */ #include /* pour utiliser les fonctions sin,cos et sqrt */ #include /* pour utiliser les fonctions graphiques de base */ #define taille 400 /* dimensions de la fénêtre graphique (taille x taille) */ #define Pi 3.14159265 /* la constante Pi */ /* --- définition du type point du plan */ typedef struct { float abs; float ord; } point; /* un point du plan est défini par ses 2 coordonnées abscisse et ordonnée */ point cons_point(float x, float y) /* construction d'un point étant donné ses coordonnées */ { point M; M.abs=x; M.ord=y; return M; } float abscisse(point M) /* abscisse d'un point */ { return M.abs; } float ordonnee(point M) /* ordonnée d'un point */ { return M.ord; } float distance(point A,point B) /* distance entre 2 points du plan */ { float base,hauteur; base = abscisse(A) - abscisse(B); hauteur = ordonnee(A) - ordonnee(B); return sqrt(base*base+hauteur*hauteur); } /* --- */ /* --- définition du type cercle */ typedef struct { point centre; float rayon; } cercle; /* un cercle est défini par son centre et son rayon */ cercle cons_cercle(point O, float r) /* construction d'un cercle de centre O et de rayon r */ { cercle C; C.centre=O; C.rayon=r; return C; } point centre(cercle C) /* centre d'un cercle */ { return C.centre; } float rayon(cercle C) /* rayon d'un cercle */ { return C.rayon; } /* --- */ /* --- fonctions graphiques */ point plan2graph(point M) /* recherche le point de la fenêtre graphique correspondant à un point du plan */ { return cons_point(abscisse(M)+taille/2,-ordonnee(M)+taille/2); } void dessin_segment(point A, point B) /* dessin d'un segment entre 2 points du plan */ { point M,N; /* les 2 points de la fenêtre graphique */ M = plan2graph(A); N = plan2graph(B); line((int)abscisse(M),(int)ordonnee(M),(int)abscisse(N),(int)ordonnee(N)); } void dessin_cote_flocon(int n, point A, point B) /* dessin d'un coté du flocon de Von Koch d'ordre n étant donnés les 2 points définissant les extrémités du coté */ /* préconditions: n>=0 */ { if(n==0) /* si l'ordre n est égal à 0 */ dessin_segment(A,B); /* dessin d'un segment */ else /* si l'ordre n est > 0 */ { point O,N; /* le segment AB est découpé en trois morceaux de même longueur. Soient O et N les 2 points tels que AO = ON = NB */ float l; /* distance entre 0 et N */ point M; /* le point M est le point du cercle de centre O et de rayon ON tel que l'angle (MON) est de Pi/3 */ O = cons_point((2.*abscisse(A)+abscisse(B))/3.,(2.*ordonnee(A)+ordonnee(B))/3.); N = cons_point((abscisse(A)+2.*abscisse(B))/3.,(ordonnee(A)+2.*ordonnee(B))/3.); l = distance(O,N); { /* calcul du point M */ float cos_a,sin_a,cos_b,sin_b; cos_a = (abscisse(N)-abscisse(O))/l; /* a est l'angle (Ox,ON) */ sin_a = (ordonnee(N)-ordonnee(O))/l; cos_b = cos_a*cos(Pi/3.)+sin_a*sin(Pi/3.); /* b est l'angle (Ox,OM) donc b = a + Pi/3 */ sin_b = sin_a*cos(Pi/3.)-cos_a*sin(Pi/3.); M = cons_point(abscisse(O)+l*cos_b,ordonnee(O)+l*sin_b); } /* dessin de chacune des courbes formant le coté du flocon */ dessin_cote_flocon(n-1,A,O); /* entre A et O */ dessin_cote_flocon(n-1,O,M); /* entre O et M */ dessin_cote_flocon(n-1,M,N); /* entre M et N */ dessin_cote_flocon(n-1,N,B); /* entre N et B */ } } void dessin_flocon(int n, cercle C_) /* dessin du flocon de Von Koch d'ordre n dans un cercle donné */ { point O=centre(C_); /* centre du cercle */ float r=rayon(C_); /* rayon du cercle */ point A,B,C; /* sommets du triangle inscrit dans le cercle */ /* détermine les points du triangle inscrit dans le cercle */ A = cons_point(abscisse(O)+r*cos(Pi/2),ordonnee(O)+r*sin(Pi/2)); B = cons_point(abscisse(O)+r*cos(Pi/2+2*Pi/3),ordonnee(O)+r*sin(Pi/2+2*Pi/3)); C = cons_point(abscisse(O)+r*cos(Pi/2+4*Pi/3),ordonnee(O)+r*sin(Pi/2+4*Pi/3)); /* dessin chacun des cotés */ dessin_cote_flocon(n,A,B); dessin_cote_flocon(n,B,C); dessin_cote_flocon(n,C,A); } main() { /* --- initialisations --- */ initgraph(taille,taille); cleargraph(); /* dessin du flocon */ dessin_flocon(5,cons_cercle(cons_point(0.,0.),200.)); flushgraph(); /* pour forcer l'affichage */ /* --- terminaisons --- */ waitgraph(); /* attente d'un frappe au clavier */ closegraph(); /* fermeture de la fenêtre graphique */ }