/*----------------------------------------------------------*/ /* */ /* AUTHOR : Eric VIOLARD */ /* E-MAIL : violard@icps.u-strasbg.fr */ /* ORGANISM : Université Louis Pasteur (Strasbourg) */ /* CREATION : 02/01/03 */ /* */ /* ---------------------------------------------------------*/ /* Programme de dessin de la courbe du Dragon d'ordre n. */ #include /* pour utiliser les fonctions graphiques de base */ #define taille 400 /* dimensions de la fénêtre graphique (taille x taille) */ /* --- 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; } /* --- */ /* --- 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_dragon(int n, point A, point B) /* dessin de la courbe du Dragon d'order n entre 2 points A et B */ /* 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 M; /* le point M entre A et B */ /* calcul de M */ M = cons_point((abscisse(A)+abscisse(B)+ordonnee(B)-ordonnee(A))/2., (ordonnee(A)+ordonnee(B)-abscisse(B)+abscisse(A))/2.); /* dessin des deux morceaux de courbes d'ordre n-1 */ dessin_dragon(n-1,A,M); /* entre A et M */ dessin_dragon(n-1,B,M); /* entre B et M */ } } main() { /* --- initialisations --- */ initgraph(taille,taille); cleargraph(); /* dessin */ dessin_dragon(20,cons_point(-100.,0.),cons_point(+100.,0.)); flushgraph(); /* pour forcer l'affichage */ /* --- terminaisons --- */ waitgraph(); /* attente d'un frappe au clavier */ closegraph(); /* fermeture de la fenêtre graphique */ }