Академический Документы
Профессиональный Документы
Культура Документы
Algorithmique et programmation II
Damien Berthet & Vincent Labatut
Universit Galatasaray
TP 10
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
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
TP 10 1/3
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 : .
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
TP 10 2/3
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
TP 10 3/3