Univ. Lille 1 - Licence STS 1ère année 2013-2014 Objectifs du TP Ce TP a pour but d'utiliser des boucles pour et d'eectuer des calculs géométriques pour dessiner des polygones. Initiation à la programmation TP : Dessiner des polygones 1 Le module camlgraph Le module Camlgraph est une adaptation du module graphics livré avec toutes les distributions de Objective Caml. Il reprend les mêmes fonctions avec les mêmes noms. Ce module permet de dessiner des points, des segments, des polygones, des cercles, de remplir certaines zones dans une fenêtre graphique. Cette fenêtre graphique peut être considérée comme un tableau de points repérés par leurs coordonnées (cf gure 1). Ces coordonnées sont des nombres entiers. Seuls les points dont les deux coordonnées sont positives ou nulles et inférieures à la largeur et à la hauteur de la fenêtre sont visibles. L'origine du repère, point de coordonnées (0, 0) est le coin inférieur gauche de la fenêtre. Figure 1 Système de coordonnées du module Camlgraph L'ensemble des fonctions oertes par ce module n'est pas présenté ici. Seules les fonctions nécessaires pour ce TP sont présentées. Pour les autres, voir le poly. 1
1.1 Utiliser le bon interprète Pour utiliser le module camlgraph dans les salles de TP, le moyen le plus simple est d'appeler l'interprète ocamlgraph. > ocamlgraph Objective Caml version 3.10.2 Camlgraph FIL IEEA universite de Lille 1 # Pour utiliser les fonctions de ce module, il faut préalablement taper la commande # open Camlgraph ;; # Dans la suite nous supposerons toujours cette commande eectuée. 1.2 Ouverture d'une fenêtre graphique Aucune fonction du module ne peut-être utilisée avant l'ouverture d'une fenêtre graphique. Cette ouverture s'eectue grâce à la procédure open_graph. val open_graph : string -> unit open_graph (s) ouvre une fenêtre graphique dont les dimensions sont indiquées par la chaîne s. Pour une ouverture de la fenêtre sur l'écran par défaut, la chaîne doit commencer par un espace. Par exemple, pour ouvrir une fenêtre graphique de 640 pixels 1 en largeur sur 480 pixels en hauteur, on utilise la commande : # open_graph (" 640x480");; Notez bien la présence d'un espace au début de la chaîne de caractères qui précise les dimensions. Remarque : Il ne peut y avoir qu'une seule fenêtre graphique à la fois. Lorsqu'une fenêtre graphique est ouverte, l'exécution d'une nouvelle commande d'ouverture n'a aucun eet. 1.3 Fermeture d'une fenêtre graphique La procédure close_graph permet de fermer la fenêtre graphique courante. val close_graph : unit -> unit close_graph () ferme de la fenêtre graphique. 1. Un pixel (picture element) est un élément indécomposable d'image. 2
1.4 Positionnement du crayon sur la fenêtre graphique Pour dessiner sur la fenêtre graphique, on utilise un crayon virtuel qui peut être placé là où on veut sur la fenêtre grâce à deux procédures présentées ci-dessous. La première de ces deux procédures est moveto qui place le crayon au point dont on donne les coordonnées en paramètre. val moveto : int * int -> unit moveto (x,y) positionne le crayon au point de coordonnées (x,y). La première coordonnée, x, est l'abscisse, et la seconde, y, est l'ordonnée. La seconde procédure est rmoveto qui translate le crayon selon le vecteur dont on passe les coordonnées en paramètre. val rmoveto : int * int -> unit rmoveto (x,y) translate le crayon selon le vecteur de coordonnées (x,y). Remarque : Le crayon peut avoir des coordonnées d'un point qui ne gure pas dans la fenêtre graphique. Les tracés eectués à partir de ce point ne sont pas visibles. 1.5 Tracé d'un segment Pour tracer des segments, il y a aussi deux procédures. La première de ces procédures permet de tracer un segment depuis la position courante vers un point dont les coordonnées sont données en paramètres. val lineto : int * int -> unit lineto (x,y) trace un segment depuis la positon courante jusqu'au point de coordonnées (x,y). La seconde procédure permet de tracer un segment depuis la position courante selon un vecteur passé en paramètre. val rlineto : int * int -> unit rlineto (x,y) trace un segment depuis la positon courante selon le vecteur de coordonnées (x,y). Exemple 1 : Voici un exemple d'utilisation de ces commandes (qui suppose qu'une fenêtre graphique de dimension 640 480 a été ouverte). Le dessin produit par ces commandes est montré sur la gure 2. # moveto (0,240) ;; # lineto (640,240) ;; # rmoveto (-320,-240);; # rlineto (0,480) ;; 3
Figure 2 Dessin 1. 1.6 Eacer le contenu d'une fenêtre graphique Pour eacer le contenu d'une fenêtre graphique, on utilise la procédure clear_graph. val clear_graph : unit -> unit clear_graph () eace le contenu de la fenêtre graphique. 2 Dessins de polygones réguliers convexes 2.1 Petits dessins à la main Question 1 En utilisant les fonctions présentées dans la première partie, ouvrez une fenêtre graphique de dimension 640 480, et dessinez un carré dont le centre est au centre de la fenêtre, dont les côtés sont parallèles à ceux de la fenêtre, et de longueur 200 (cf gure 3). Question 2 En utilisant les fonctions présentées dans la première partie, ouvrez une fenêtre graphique de dimension 640 480, et dessinez un carré dont le centre est au centre de la fenêtre, dont les diagonales sont parallèles aux côtés de la fenêtre, et dont les diagonales sont de longueur 200 (cf gure 4). 4
Figure 3 Carré côtés // bords fenêtre 2.2 Dessiner un polygone régulier convexe Un polygone régulier convexe, est un polygone dont tous les sommets sont inscrits sur un cercle et sont régulièrement répartis sur ce cercle, et dont les côtés rejoignent deux sommets consécutifs sur le cercle. Le centre du cercle coincide alors avec le centre de gravité du polygone (cf gure 5). Les fonctions utiles pour dessiner des polygones réguliers convexes 1. les fonctions trigonométriques sin et cos : float > float (les angles sont mesurés en radians) ; 2. les fonctions de conversion des entiers en ottants float_of_int et des ottants en entiers int_of_float ; La constante π 3, 141592... (rapport de la circonférence du cercle à son rayon) intervient dans les calculs des coordonnées des sommets d'un polygone régulier. Question 3 En sachant que π = 4 arctan (1), dénissez en Caml une constante nommée pi. En Caml, la fonction arctan est nommée atan. Question 4 consécutifs? Question 5 Pour un polygone régulier convexe à n côtés, quel est l'angle au centre entre deux rayons Dessinez un triangle équilatéral dont le centre de gravité coincide avec le centre de la fenêtre, dont une des trois hauteurs est horizontale, et dont les sommets sont à une distance égale à 200 du centre de gravité. 5
Figure 4 Carré diagonales // bords fenêtre Question 6 Réalisez une procédure polygone_convexe qui dessine un polygone régulier convexe. Cette procédure doit prendre quatre paramètres : 1. n : le nombre de côtés (int) ; 2. cx et cy les coordonnées du centre du cercle circonscrit (int) ; 3. r : le rayon du cercle circonscrit (int). Le type de cette procédure est donc int int int int > unit. Question 7 Utilisez votre procédure polygone_convexe pour réaliser un dessin comme celui montré à la gure 7 constitué de 10 pentagones dont les centres sont régulièrement disposés sur un cercle. 3 Dessins de polygones étoilés Les polygones réguliers étoilés dièrent des polygones réguliers convexes en ce sens que les côtés du polygone ne relient plus deux sommets consécutifs du cercle circonscrit (cf gure 8). Question 8 En étudiant la gure 8, adaptez la procédure polygone_convexe pour en faire une procédure polygone_etoile qui dessine un polygone étoilé. Cette procédure devra certainement prendre un cinquième paramètre (Voir les deux étoiles à 9 côtés de la gure). Question 9 Comment, en utilisant la procédure polygone_etoile, peut-on (très simplement) réaliser le dessin montré sur la gure 9? Question 10 Avec la procédure polygone_etoile, réalisez le dessin de la gure 10. 6
Figure 5 Un pentagone inscrit dans un cercle Figure 6 Triangle équilatéral 7
Figure 7 10 pentagones centrés sur un cercle Figure 8 4 polygones étoilés 8
Figure 9 Avec des polygones étoilés Figure 10 Avec des pentagones étoilés 9