API2-prime 2013 2014 Licence STS - Semestre 3 TP3 : coloriage Objectifs : écrire des fonctions récursives manipuler les primitives graphiques du module Graphics réviser la manipulation des couples Objet du TP : colorier une région du plan délimitée par un bord fermé dessiner des fractales 1 Coloriage On veut écrire une procédure de coloriage de régions du plan délimitée par des courbes fermées. Le coloriage s arrête une fois le bord de la région atteinte. Par exemple, la figure 1 montre une figure représentant deux rectangles, l un étant inclus dans l autre. Dans la figure?? la région du plan délimitée par les bords des deux rectangles a été coloriée en rouge. Et enfin dans la figure?? la région intérieur au petit rectangle a été coloriée en bleu. Figure 1 Une figure non coloriée On supposera dans ce travail que les bords des régions sont de couleur noire, et qu on ne colorie pas en noir. let couleur_bord = Graphics. black 1
Figure 2 Une région coloriée Question 1 simple rectangle : (int int) (int int) unit (x 1, y 1 ), (x 2, y 2 ) () qui dessine un rectangle dans la couleur de bord dont le coin inférieur gauche est aux coordonnées (x 1, y 1 ) et le coin supérieur droit est aux coordonnées (x 2, y 2 ). Question 2 double rectangle : (int int) (int int) int unit (x 1, y 1 ), (x 2, y 2 ), e () qui dessine dans la couleur de bord un premier rectangle dont le coin inférieur gauche est aux coordonnées (x 1, y 1 ) et le coin supérieur droit est aux coordonnées (x 2, y 2 ), puis un second rectangle dont les bords sont à e pixels à l extérieur du premier. Cela donnera un dessin comme sur la figure 1. Question 3 On remarque de plus que le module Graphics fournit la fonction point_color qui permet de connaître la couleur d un pixel. Ecrire une fonction booléenne sur le bord : (int int) bool (i, j) b qui retourne vrai si le point de coordonnées (x, y) est sur un bord. 1.1 Coloriage de régions convexes Une région est convexe si à chaque fois qu on prend deux points intérieurs ou sur le bord de cette région, le segment qui les relie est entièrement inclus dans la région. Les rectangles, les cercles, ellipses sont des régions convexes (cf figure??. Les étoiles ne sont pas des régions convexes (cf??). Vous allez dans les questions qui suivent colorier des régions convexes. Aucune méthode n est imposée, réflechissez sur le papier à la manière de faire avant de vous lancer dans la programmation. 2
Figure 3 Deux régions coloriées Question 4 coloriage1 : (int int) (int int) unit (x 1, y 1 ), (x 2, y 2 ) () qui colorie l intérieur d un rectangle en rouge en connaissant les coordonnées (x 1, y 1 ) et (x 2, y 2 ) de ce rectangle. Question 5 Dessinez un rectangle (à bords noirs) dans une fenêtre graphique, et testez la procédure de la question précédente. Question 6 coloriage2 : (int int) unit (x, y) () qui colorie l intérieur d un rectangle en connaissant uniquement les coordonnées d un point (x, y) de l intérieur. Question 7 Dessinez un rectangle (à bords noirs) dans une fenêtre graphique, et testez la procédure de la question précédente. Question 8 Votre méthode de coloriage numéro 2 convient-elle pour des cercles? des ellipses? des losanges? Testez! Question 9 Et pour une région non convexe? 1.2 Coloriage de régions quelconques Si votre méthode de coloriage convient pour toute région qu elle soit convexe ou non, c est très bien! Néanmoins, vous allez découvrir dans cette partie un algorithme récursif qui convient pour toute région. Cet algorithme récursif se résume à : on colorie le pixel courant de la couleur voulue et on appelle récursivement l algorithme sur chacun de ses voisins qui n est pas sur le bord 3
Figure 4 Régions convexes Reste à préciser quels sont les voisins d un pixel. Un pixel de coordonnées (x, y) a quatre voisins : 1. le voisin du nord de coordonnées (x, y + 1) ; 2. le voisin de l est de coordonnées (x + 1, y) ; 3. le voisin du sud de coordonnées (x, y 1) ; 4. et le voisin de l ouest de coordonnées (x 1, y). Question 10 Programmez la fonction voisins : (int int) (int int)array (x, y) t qui renvoie la liste des voisins du pixel passé en paramètre par ses coordonnées, sous forme d un tableau de coordonnées. Question 11 Programmez une procédure de coloriage : coloriage3 : (int int) color unit (x, y), c () qui prend les coordonnées d un point (x, y) intérieur à la région à colorier ainsi qu une couleur c, et colorie cette région. CU : la couleur passée en paramètre ne doit pas être la même que celle utilisée pour tracer le bord de la région à colorier. Question 12 Testez votre procédure pour différentes régions convexes ou non. Par exemple, après avoir dessiné les contours définis par le le code suivant draw_poly [ (0,0); (20,0); (25,40); (35,40); (40,0); (60,0); (40,100); (20,100); (0,0) ] ; draw_poly [ (25,50); (35,50); (30,80); (25,50) ] ; draw_poly [ (100,0); (120,0); (120,50); (130,50); (150,60); (150,90); (130,100); (120,100); (100,100); (100,0) ] ; 4
Figure 5 Régions non convexes draw_rect 200 0 20 100 ; draw_arc 210 100 20 20 300 360 ; draw_arc 210 100 20 20 0 240 coloriez en rouge la région contenant le point (210, 101), en jaune celle contenant le point (10, 10), en vert celle contenant le point (210, 91) et enfin en magenta celle contenant le point (110, 91). Question 13 On peut envisager une autre notion de voisins en incluant les voisins 1. du nord-est, de coordonnées (x + 1, y + 1) ; 2. du sud-est, de coordonnées (x + 1, y 1) ; 3. du sud-ouest, de coordonnées (x 1, y 1) ; 4. et du nord-ouest, de coordonnées (x 1, y + 1). Modifiez votre fonctions voisins pour inclure ces nouveaux pixels voisins, puis testez votre procédure de coloriage. Que constatez-vous? Expliquez! 2 Fractales Dans cette partie, on souhaite utiliser un algorithme récursif pour produire des fractales telles que dessinée figure??. On comprend bien que cette figure est récursive : dans chaque 1/3 du carré principal on répéte la même structure. En théorie, cela continue à l infini. Bien entendu, l écran d un ordinateur n est pas infini et on choisira de s arrêter lorsque la largeur d un carré devient inférieur à 1 pixel. L algorithme pour produire de telles fractales est le suivant : Algorithme carres_recursifs (x,y) l Entrée: x,y les coordonnées du coin inférieur gauche l la largeur Sortie: dessin de carrés récursifs Dessiner un carre aux coordonnées x,y de c^oté l 5
Figure 6 Exemple de fractale avec des carrés Si l est suffisamment grand Alors Répéter le dessin de carrés récursifs de c^oté l/3 aux quatre angles Question 14 Si (x, y) est le coin inférieur gauche d un carré de côté l, quelles vont être les coordonnées des quatre coins où l algorithme récursif devra être appliqué? Question 15 Ecrire la procédure qui implémente l algorithme que vous avez trouvé. Question 16 Tester pour x = 0, y = 0 et l = 300. carres recursifs : (int int) int unit (x, y), l () 6