Vous êtes sur la page 1sur 3

FIT 2 [INF232] 2010/11 Gnie Informatique

Algorithmique et programmation II
Damien Berthet & Vincent Labatut
Universit Galatasaray

TP 10

enveloppe dun nuage de points

1 Prsentation
On dit quun polygone est crois sil possde au moins deux cts scants. Lenveloppe quelconque dun nuage de points est un polygone non-crois dont les sommets sont les points du nuage.

un nuage de points

un polygone crois construit sur le nuage

une enveloppe du nuage

une autre enveloppe du mme nuage

Lobjectif de ce TP est de tracer lenveloppe dun nuage de points gnr alatoirement.

2 Principe du calcul de lenveloppe


Dterminer une enveloppe consiste trier les points afin dobtenir un chemin ferm, nonscant, et joignant chacun des points du nuage. Algorithme : Soit le point le plus gauche de lcran (si plusieurs points sont sur la mme colonne, est le point le plus haut).

Pour chaque point P du nuage de points, on calcule langle dsigne un vecteur directeur de laxe horizontal. On a la proprit

, o .

Algorithmique et programmation II

FIT 2 [INF232] 2010/11 Gnie Informatique

TP 10 1/3

enveloppe dun nuage de points

On trie les points (sauf ) par dcroissants. Si deux points on le mme , on considre que le plus haut est le plus grand. On obtient donc une liste ordonne des points : .

On trace les cts du polygone

3 Implmentation
Dcompressez larchive fournie avec ce sujet. Vous y trouvez un main vide ainsi que les bibliothques graphisme et liste_dbl que nous avons dj utilises. La bibliothque graphisme contient deux nouvelles fonctions : void genere_point(int *x, int *y) : permet de gnrer alatoirement les coordonnes dun point. Ces coordonnes sont, bien entendu, renvoyes par adresse. void affiche_point(int x, int y, Uint32 coul) : permet de dessiner un point de coordonnes , sous la forme dune croix. La bibliothque liste_dbl contient une nouvelle fonction : void trie_liste_decrois(liste *l) : permet de trier une liste dans lordre dcroissant.

Exercice 1
On veut reprsenter la liste de points en utilisant une liste chane. Un lment de cette liste sera caractris par : des coordonnes x et y (exprimes en pixels) un angle (exprim en radians) On ne va donc plus manipuler une liste de simples entiers, comme ctait le cas dans le TP sur les listes chanes. Vous devez adapter la bibliothque liste_dbl aux nouvelles donnes : modifiez la structure de donnes element. modifiez les en-ttes des fonctions cree_element et affiche_liste dans liste_dbl.h et les fonctions elles-mmes dans liste_dbl.c.

Exercice 2

Algorithmique et programmation II

FIT 2 [INF232] 2010/11 Gnie Informatique

TP 10 2/3

enveloppe dun nuage de points

Dans main.c, crivez une fonction init init_nuage(int n, liste *l) qui cre un nuage de points sous la forme dune liste de n points gnrs alatoirement (en utilisant genere_point). Les seront initialiss . La fonction renverra en cas de succs et en cas derreur.

Exercice 3
crivez une fonction void affiche_nuage(liste l , Uint32 coul) qui dessine les points contenus dans la liste passe en paramtre (en utilisant affiche_point).

Exercice 4
crivez une fonction element* extrait_P0(liste *l) qui calcule quel est le point de la liste qui correspond , qui enlve ce point de la liste, mais sans supprimer llment correspondant, et qui renvoie un pointeur sur lelement correspondant . Attention : la liste est doublement chane.

Exercice 5
crivez une fonction float calcule_angle(int v_x1, int v_y1, int v_x2, int v_y2) qui calcule langle exprim en radians, et ayant pour coordonnes respectives et . Rappels : Calcul du cosinus : o reprsente la norme de . Calcul du produit scalaire (dans une base orthonormale) : . Attention : langle obtenu nest pas orient (au sens trigonomtrique). Remarque : la bibliothque math.h contient une fonction double acos(double a) qui permet de calculer un angle (exprim en radians) partir de son cosinus.

Exercice 6
crivez une fonction void calcule_theta(liste *l, element p0) qui calcule (grce calcule_angle) le de chaque point P, en fonction de . Noubliez pas dorienter langle renvoy par calcule_angle, suivant la position de P relativement (P est-il au dessus ou au dessous de ?).

Exercice 7
Dans liste_dbl.c, compltez la fonction int compare_elements(element e1, element e2) dont le rle est de comparer deux lments e1 et e2, et de renvoyer un entier positif si , ngatif si , ou nul sinon. Remarque : la relation dordre entre les elements a t dcrite dans le principe de calcul de lenveloppe.

Exercice 8
crivez une fonction void affiche_polygone(liste l, Uint32 coul) qui dessine le polygone (ferm) constitu des points contenus dans une liste l quelconque passe en paramtre. Utilisez les fonctions attend et raffraichit (c.f. le TP sur les figures fractales) de manire ce que le polygone soit dessin progressivement (un ct la fois).

Exercice 9
crivez une fonction void enveloppe(liste *l) qui ordonne la liste l passe en paramtre, de manire obtenir son enveloppe. Vous utiliserez la fonction trie_liste_decrois de la bibliothque liste_dbl. Dans le main, initialisez le nuage de points, affichez-le, calculez son enveloppe, et enfin affichez-la. Pensez rajouter le point , qui avait t prcdemment retir.

Algorithmique et programmation II

FIT 2 [INF232] 2010/11 Gnie Informatique

TP 10 3/3