Laboratoire 3 - ÉTS : Cours par sigle · Décomposition d’un polygone concave en polygones...
-
Upload
duongquynh -
Category
Documents
-
view
226 -
download
0
Transcript of Laboratoire 3 - ÉTS : Cours par sigle · Décomposition d’un polygone concave en polygones...
École de technologie supérieure
Génie de la production automatisée
GPA665
Structures de données et algorithmes
Laboratoire 3
Décomposition d’un polygone concave en polygones convexes
Responsable du cours : Mohamed Cheriet, ing., Ph. D. Rédaction du laboratoire : Jean-Christophe Demers Révision et barème de correction : Yan Levasseur & Mathieu Binette Temps alloué pour ce laboratoire : 4 périodes de laboratoire
Résumé
En trois comme en deux dimensions, la gestion de formes à géométrie complexes nécessite beaucoup de manipulations mathématiques. Souvent, ces manipulations seront simplifiées par la décomposition d’une forme concave en plusieurs formes convexes, pour lesquelles les algorithmes d’optimisation sont rapides et efficaces. Le graphisme et la planification de trajectoire d’un robot mobile sont des exemples où la décomposition en formes convexes est très avantageuse.
Ce laboratoire vous donnera l’occasion de réaliser un algorithme simple de décomposition
en formes convexes. Ce sera l’occasion de mettre en pratique les notions relatives à
l’utilisation du TDA arbre. De plus, par ce laboratoire, vous expérimenterez des notions
telles que les types structurés, types énumérés, pointeurs, tableaux dynamiques,
récursivité, et l’utilisation de structures de données et de fonctions existantes.
Il vous incombera donc de développer un algorithme efficace pour résoudre le problème concret de la concavité d’une forme en adoptant une méthode de programmation rigoureuse qui tient compte des concepts fondamentaux de qualité logiciel.
GPA665 STRUCTURES DE DONNEES ET ALGORITHMES AUTOMNE 2002
LABORATOIRE 3 2 / 13
Énoncé du problème
La description d’une entité par un polygone apporte des solutions à une multitude de
problèmes de différentes natures. Ainsi, il est pertinent de développer une panoplie
d’outils algorithmiques et géométriques servant à la manipulation de polygones. Or, il
existe plusieurs propriétés particulières aux polygones convexes qui permettent le
développement d’outils puissants, efficaces et uniques, qui sont très lourds ou simplement
irréalisables pour le cas de polygones concaves.
Pour cette raison, il est souvent préférable de diviser un polygone concave en plusieurs
polygones convexes et ainsi pouvoir utiliser les différentes propriétés de ces polygones
particuliers. Malgré tout, la décomposition d’un polygone n’est pas une tâche triviale et
demande l’élaboration d’un algorithme d’une certaine complexité.
Dans ce laboratoire vous aurez à implanter une solution fonctionnelle à ce problème.
Finalement, la nature récursive du problème sera exploitée.
Définitions d’un polygone convexe
Soit P, un polygone formé de n sommets et n segments. P est convexe s’il répond à la
définition suivante (sinon P est concave) :
il est impossible de tracer une droite à l’intérieur du polygone qui traverse le
contour de ce dernier.
Une autre définition utile est :
tous les angles intérieurs du polygone sont inférieurs à 180°.
142,1°121,5°
77,9°
131,6°
125,8°
121,0°
121,5°
77,9°
131,6°
44,0°
52,8°
292,2°
Polygone convexe Polygone concave
Sommets convexes
Sommets concaves
Segments défini par deux sommets
Figure 1 : Exemples de polygone convexe et de polygone concave
GPA665 STRUCTURES DE DONNEES ET ALGORITHMES AUTOMNE 2002
LABORATOIRE 3 3 / 13
Nature récursive du problème et structure de données
Intuitivement, il est facile de décomposer un polygone concave en deux sous-polygones
dont un est convexe et l’autre indéfini. Développer un tel algorithme de décomposition
peut être très pratique puisque la nature récursive du problème apparaît dès le départ. En
effet, il suffit d’utiliser simplement ce même algorithme de décomposition sur le
sous-polygone indéfini si ce dernier est concave. De cette façon, en appliquant
récursivement cet algorithme de décomposition sur tous les sous-polygones indéfinis qui
sont concaves, on obtient une décomposition complète du polygone concave initial en
plusieurs polygones convexes.
Puisque cette approche de décomposition donne pour chaque sous-polygone concave
deux sous-polygones pour le décrire, on utilise un arbre binaire permettant de représenter
cette structure de données. Dans ce type d’arbre, chacun des noeuds correspond à un
polygone. Ainsi, la racine correspond au polygone concave initial qui est décrit par toutes
les feuilles de l’arbre (correspondant aux sous-polygones convexes de l’arbre). Il est
intéressant de remarquer que l’arbre obtenu n’est aucunement équilibré puisque ce
dernier possède pour chaque noeud un enfant avec un seul et unique descendant.
Néanmoins, cette représentation d’un polygone concave par des polygones convexes
reste performante et très bien adaptée étant donné la nature récursive du problème.
La figure 4 montre un exemple du résultat obtenu par une telle approche.
Algorithme de décomposition
Il existe plusieurs approches pour décomposer un polygone concave en polygones
convexes. L’approche présentée ici offre certaines caractéristiques intéressantes.
Premièrement elle permet une solution élégante en utilisant l’approche récursive
précédemment expliquée. Deuxièmement, elle permet une décomposition du polygone
initiale en sous-polygones de n sommets et non pas des polygones triangulaires formés
de 3 sommets uniquement (comme plusieurs autres algorithmes le font). De cette façon,
le nombre de sous-polygones convexes nécessaires à la représentation du polygone
concave peut être beaucoup moindre. Finalement, il est possible d’optimiser l’algorithme
de façon à décomposer le polygone concave en un nombre optimal de sous-polygones
convexes. Cette optimisation se fait en prenant, pour chaque appel récursif, le
sous-polygone convexe qui minimise le nombre de sommets du sous-polygone indéfini.
Cette optimisation n’est pas demandée dans le cadre de ce travail1.
L’algorithme de décomposition2 d’un polygone concave en sous-polygones convexes est
réalisé en 2 étapes principales :
1. On identifie tous les sommets Si correspondant aux concavités Ci du polygone P.
2. On détermine si le polygone est concave par le nombre de sommets correspondant aux
concavités (nc). Si nc = 0 alors le polygone est convexe et on arrête le processus, sinon on
divise le polygone concave en deux polygones : un polygone convexe et un polygone indéfini.
Cette division est la partie la plus délicate du travail à faire et se fait en 4 étapes.
i. On identifie un sommet Si pour lequel il existe deux voisins consécutifs, Si+d et Si+2d qui
respectent les trois critères suivants3 :
1 Les étudiants qui trouveront la façon de faire cette optimisation et qui prendront le temps de l’implanter se
mériteront une évaluation plus clémente ! 2 L’algorithme qui est décrit ici est la version simplifiée, sans optimisation.
GPA665 STRUCTURES DE DONNEES ET ALGORITHMES AUTOMNE 2002
LABORATOIRE 3 4 / 13
a. le sommet Si+d est un sommet convexe (ceci implique que le polygone formé par les
trois sommets didii SSS 2 est un polygone convexe);
b. le sommet Si+3d est à l’extérieur (la frontière étant incluse) du polygone formé par les
sommets didii SSS 2 ;
c. le segment formé par les sommets Si et Si+2d n’entre pas en collision avec le
polygone à scinder.
ii. On parcourt les sommets du polygone à partir de Si+jd (j = 2) jusqu’à ce qu’on atteigne un
sommet Si+jd qui correspond à l’un des cinq critères suivants :
a. Si+jd est un sommet correspondant à une concavité;
b. le sommet Si+(j+1)d est à l’intérieur (la frontière étant exclue) du polygone formé par
les sommets Si à Si+jd;
c. le segment formé par les sommets Si+(j+1)d et Si entre en collision avec le polygone à
scinder;
d. le polygone créé par les sommets Si à Si+(j+1)d est concave;
e. le polygone créé par les sommet Si à Si+(j+1)d entre en collision avec un des
sommets restants du polygone à scinder.
iii. On scinde le polygone concave P en deux polygones : le polygone convexe Pconvexe
formé par les sommets Si à Si+jd et le polygone indéfini Pindéfini formé par les sommets
Si+(j+1)d à Si (en respectant la définition circulaire des sommets décrivant les polygones).
iv. On recommence récursivement le processus avec Pindéfini
Voici un exemple pas à pas de cet algorithme pour le polygone suivant (les nombres
indiquent l’ordre dans lequel sont définis les sommets) :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Sommets convexes
Sommets concaves
Segments défini par deux sommets
Figure 2 : Polygone concave
3 d est la direction du voisin considéré, c’est-à-dire 1 ou -1. Pour ce laboratoire on simplifie l’algorithme en posant
d = 1.
GPA665 STRUCTURES DE DONNEES ET ALGORITHMES AUTOMNE 2002
LABORATOIRE 3 5 / 13
Polygone convexe résultat de l’appel
récursif précédent Polygone indéfinie résultat de l’appel
récursif précédent
Description de l’algorithme pour passer de l’appel récursif courant au suivant
1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Polygone initial. nc = 4 Si = 2 j = 2 défini par la contrainte 2c
2
1
2
3
1
2
3
4
5
6
7
8
9
10
11
12
13
Ces polygones sont le résultat de l’algorithme appliqué au polygone initial après le premier appel de la fonction de décomposition. nc = 4 Si = 1 j = 2 défini par la contrainte 2c
3
1
2
3 1
2
3
4
7
8
9
5
6
10
1112
nc = 4 Si = 1 j = 3 défini par la contrainte 2a
4
1
2
3
4
7
89
10
1
4
5
6
2
3
nc = 4 Si = 3 j = 4 défini par la contrainte 2d
5
5
2
3
4
1
1
23
4
5
6
7
nc = 3 Si = 3 j = 2 défini par la contrainte 2a
GPA665 STRUCTURES DE DONNEES ET ALGORITHMES AUTOMNE 2002
LABORATOIRE 3 6 / 13
6
1
2
3
4
56
1
2
3
nc = 2 Si = 3 j = 2 défini par la contrainte 2d
7
2
3
1
12
3
4
5
nc = 1 Si = 2 j = 2 défini par la contrainte 2a
8
1
2
3
34
1
2
nc = 1 Si = 1 j = 2 défini par la contrainte 2d
9
3
1
2
12
3
nc = 0 polygone convexe
fin des appels récursifs
Voici le résultat de la décomposition obtenue :
Figure 3 : Résultat obtenu après la décomposition du polygone concave
Le graphique suivant montre le résultat de l’arbre de décomposition binaire
résultant :
GPA665 STRUCTURES DE DONNEES ET ALGORITHMES AUTOMNE 2002
LABORATOIRE 3 7 / 13
1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
1
2
3
4
5
6
7
8
9
10
11
1
2
3
4
7
8
9
1
2
3
5
6
7
89
10
1
4
5
6
2
3
12
13
10
1112
1
2
3
4
1
23
4
5
6
7
5
2
3
4
1
4
56
1
2
3
1
2
3
12
3
4
5
2
3
1
34
1
2
1
2
3
12
3
3
1
2
Figure 4 : Exemple d'arbre binaire obtenu représentant la décomposition d'un polygone concave
GPA665 STRUCTURES DE DONNEES ET ALGORITHMES AUTOMNE 2002
LABORATOIRE 3 8 / 13
On remarque que cette décomposition en polygones convexes ne donne pas un nombre
optimal de polygones. Après optimisation, on obtient plutôt cette décomposition qui
contient 5 polygones au lieu des 9 polygones obtenus par l’algorithme de base. N’oublier
pas que vous ne devez pas implanter la version optimisée de l’algorithme, cette partie
n’est ici qu’à titre informatif pour ceux qui désirent aborder le problème.
Figure 5 : Décomposition optimal du polygone concave
Programme à développer
Le programme que vous devez réaliser est évidemment l’implantation de l’algorithme
précédemment décrit. Pour ce faire vous devez respecter tous les points suivants.
Structure logiciel
Votre programme doit être une extension du corps de programme que vous avez utilisé
pour le laboratoire 2. De cette façon, vous aurez accès à toutes les fonctions qui avaient
été préalablement implantées :
gestion de l’interface Windows ;
gestion de la boucle des messages de Windows ;
gestion de la fenêtre de saisie du nom de fichier d’entrée ;
gestion de la fameuse fenêtre « À propos… » ;
gestion des menus et de la barre d’outils ;
toutes les fonctions graphiques sont déjà incluses.
De plus, vous avez à votre portée une bibliothèque de calculs géométriques dédiés à ce
laboratoire. Cette bibliothèque vous donne une solution pour chaque sous-problèmes
posés par l’algorithme de décomposition (principalement la vérification des différentes
contraintes et conditions). Ainsi, il ne vous reste qu’à développer le corps global de
l’algorithme en manipulant adéquatement les types de données et en faisant appel aux
différentes fonctions fournies en temps opportun.
Votre programme doit être en mesure de lire un fichier texte dans lequel se trouve la
description d’un polygone. Vous devez en faire une validation de base afin de vous
assurer que le fichier respecte le format imposé. Après avoir lancé votre algorithme de
décomposition, vous devez afficher les informations suivantes :
tracer tous les polygones convexes résultants de la décomposition (tel que
montré à la figure 3), vous devez par contre afficher chaque polygone d’une
couleur différente;
GPA665 STRUCTURES DE DONNEES ET ALGORITHMES AUTOMNE 2002
LABORATOIRE 3 9 / 13
afficher les informations suivantes sur la structure de données :
o le nombre de polygones convexes requis pour la description;
o le nombre total de sommets et de segments utilisés pour décrire tous les
polygones convexes ;
o la somme de tous les périmètres des polygones convexes.
Structure de données à respecter
Tous les types de données sont déjà déclarés dans la bibliothèque de fonctions
géométriques disponible sur le site web. Vous devez donc utiliser correctement les types
déjà définis pour pouvoir utiliser les fonctions existantes. De plus, puisque vous
programmez avec un compilateur C++ nous nous permettons d’utiliser les types booléens
(qui ne sont pas portable directement sur un compilateur C). Voici les types qui ont été
déclarés et que vous devez utiliser :
Un type énuméré IsConvex indiquant si un sommet ou un polygone est
convexe, concave ou indéfini.
typedef enum {icConcave = 0, icConvex = 1, icUndef = 10} IsConvex;
Une structure TVertex contenant les informations pour chaque sommet.
typedef struct {
int X, Y;
IsConvex VertexIsConvex;
} TVertex;
Une structure TPolygon définissant chaque polygone. Cette structure est celle
utilisée pour chaque noeud de l’arbre de représentation binaire. C’est pourquoi on y remarque les deux pointeurs vers les sous-polygones (SubConvexPolygon
et SubUndefPolygon). Puisque le nombre de sommets de chaque polygone est
connu (mémorisé par la variable NbVertices), un tableau de TVertex contenant
la liste des sommets est créé dynamiquement pour chaque nouvel instanciation de polygone via le pointeur Vertices.
typedef struct _TPolygon{
int NbVertices;
TVertex *Vertices;
IsConvex PolygonIsConvex;
struct _TPolygon *SubConvexPolygon;
struct _TPolygon *SubUndefPolygon;
} TPolygon;
Le schéma de la page suivante montre un exemple de cette structure.
Les nombreuses fonctions de traitement sur les polygones sont incluses dans le fichier
présent sur le site web. Vous avez accès directement au code et toute l’information sur
ces fonctions se retrouve aux en-têtes de chaque fonction définie dans le fichier PolygonLibrary.c. Principalement vous allez devoir faire appel aux fonctions suivantes :
DefineVerticesConvexity
DefinePolygonConvexity
PointIsInsideConvexPolygon
SegmentIntersectSegment
SegmentIntersectPolygon
GPA665 STRUCTURES DE DONNEES ET ALGORITHMES AUTOMNE 2002
LABORATOIRE 3 10 / 13
X
Y
VertexIsConvexX
Y
VertexIsConvexX
Y
VertexIsConvexX
Y
VertexIsConvexX
Y
VertexIsConvexX
Y
VertexIsConvexX
Y
VertexIsConvexX
Y
VertexIsConvexX
Y
VertexIsConvexX
Y
VertexIsConvexX
Y
VertexIsConvexX
Y
VertexIsConvexX
Y
VertexIsConvex
NbVertices
Vertices
PolygonIsConvex
SubConvexPolygon
SubUndefPolygon
NbVertices
Vertices
PolygonIsConvex
SubConvexPolygon
SubUndefPolygon
NbVertices
Vertices
PolygonIsConvex
SubConvexPolygon
SubUndefPolygon X
X
NbVertices
Vertices
PolygonIsConvex
SubConvexPolygon
SubUndefPolygon
NbVertices
Vertices
PolygonIsConvex
SubConvexPolygon
SubUndefPolygon X
X
NbVertices
Vertices
PolygonIsConvex
SubConvexPolygon
SubUndefPolygon
NbVertices
Vertices
PolygonIsConvex
SubConvexPolygon
SubUndefPolygon X
X
NbVertices
Vertices
PolygonIsConvex
SubConvexPolygon
SubUndefPolygon
NbVertices
Vertices
PolygonIsConvex
SubConvexPolygon
SubUndefPolygon X
X
X
X
......
......
......
......
Figure 6 : Exemple de la structure de données
Évidemment vous allez devoir réaliser toutes les fonctions nécessaires à la gestion de la
structure de données. C’est-à-dire l’instanciation de toute la structure, l’ajout d’un noeud
dans l’arbre, la suppression de tous les noeuds, la gestion dynamique de la mémoire, la
lecture du fichier d’entrée et toutes les autres fonctions que vous jugerez pertinentes.
Fichier d’entrée
Le fichier d’entrée est normalisé et doit correspondre au format suivant. On retrouve en
en-tête le nombre de noeuds n du polygone. Ensuite, sur n lignes les coordonnées des
sommets décrivant le polygone suivant ce format spécifique (X, Y). Voici un polygone
ainsi que sa représentation selon ce format :
GPA665 STRUCTURES DE DONNEES ET ALGORITHMES AUTOMNE 2002
LABORATOIRE 3 11 / 13
13
(100,20)
(40,40)
(40,120)
(140,160)
(120,140)
(160,120)
(120,80)
(140,120)
(60,60)
(220,80)
(160,160)
(260,120)
(260,60)
Figure 7 : Exemple de fichier d'entrée
Lors de la lecture du fichier, vous devez vous assurer que ce dernier et vérifier les 2 points
suivants :
le nombre de sommets indiqué correspond bien au nombre de sommets inclus
dans le fichier;
les coordonnées doivent être inclus dans les intervalles suivants 640,0x et
480,0y .
Informations supplémentaires
Tous les algorithmes qui ont été décrits ici et toutes les fonctions que vous devez utiliser
utilisent une description normalisée du polygone. Ainsi, il est essentiel que tous les
polygones traités (soit ceux en entrée ou ceux que vous générez) soient décrits de la
façon suivante :
les sommets contigus du polygone se retrouvent contigus dans la liste de
description (le tableau référencé par la variable Vertices dans la structure
TPolygon);
la description du polygone se fait toujours dans le sens anti-horaire.
Finalement, vous ne devez utiliser aucune variable globale et votre code doit être lisible
tout en étant bien documenté.
GPA665 STRUCTURES DE DONNEES ET ALGORITHMES AUTOMNE 2002
LABORATOIRE 3 12 / 13
Évaluation
L’évaluation de ce laboratoire sera différente des deux laboratoires précédents et permettra à l’évaluateur de faire une évaluation interactive. L’évaluation sera en trois parties :
1. Comme d’habitude, vous devez produire un rapport comprenant un organigramme général du déroulement de votre programme (1 page). Vous devez aussi remplir la grille d’évaluation. Par contre, notez qu’il n’y aura pas de questions à répondre par écrit.
2. Vous aurez à faire une brève présentation orale au chargé de laboratoire. Cette présentation d’une dizaine minutes vous donnera la chance d’expliquer en détail les éléments importants du laboratoire. Par exemple, vous pouvez expliquer votre approche globale, les difficultés que vous avez eues et les solutions que vous avez trouvées.
3. Finalement, vous aurez à répondre aux questions de l’évaluateur (environ 10 minutes également). Ces questions permettront de bien cerner votre niveau de compréhension.
L’évaluation se fera pendant la semaine d’examen. La date exacte n’est pas déterminée mais l’évaluation sera pendant la période des examens finaux. Lors des deux dernières périodes de laboratoire, une feuille circulera vous permettant de réserver un bloc horaire. C’est votre responsabilité de vous présenter à cette évaluation.
À titre indicatif, voici des exemples de questions qui pourraient vous être posées :
Quelle est la pertinence de la structure de données utilisée dans ce laboratoire. En quoi cette structure est-elle mieux adaptée au problème de la division en sous-polygones qu’une autre structure de données ? Donnez les avantages et les inconvénients de la structure de données en arbre pour ce problème.
Que seraient les implications de l’imposition d’une forme plus équilibrée de l’arbre ? Est-ce réalisable ?
Imaginons le problème de la sélection d’un des sous-polygones affiché à l’écran à l’aide de la souris. Élaborez un moyen par lequel il serait possible d’identifier le sous-polygone sélectionné (avec comme seule information la position X et Y de la souris) sans parcourir toute la structure de données. Quel TDA suggèreriez-vous pour cette tâche ?
La remise se fait par un fichier ZIP correspondant aux éléments suivants :
Le dossier principal de votre projet Visual C++ incluant tous ses dépendants (sauf les librairies principales du C/C++). N’oubliez pas de bien documenter votre code source.
Une version exécutable de votre programme.
Un PDF de votre rapport.
Le fichier doit être nommé : GPA665_LAB3_Polygone_VotreNom.ZIP
Le tout doit être remis par courriel au chargé de laboratoire avant la date prescrite.
GPA665 STRUCTURES DE DONNEES ET ALGORITHMES AUTOMNE 2002
LABORATOIRE 3 13 / 13
Grille d’évaluation
En guise d’autoévaluation, imprimez et remplissez vous-même cette section. Mentionnez
une référence (nom de fichier et numéro de ligne) lorsque demandé pour faciliter la
vérification par le correcteur.
Spécifications techniques Oui Non Référence (fichier, ligne)
5 Validation du fichier d’entrée
_____________________
10 Séparation des polygones réussie
10 Affichage des sous-polygones colorés à partir d’un fichier .SDA en animation
_____________________
5 Affichage des statistiques pour les sous-polygones : nombre total de polygones, de segments, somme de tous les périmètres.
_____________________
Spécifications de programmation Oui Non
5 Utilisation de la structure de données imposées (arbre binaire)
_____________________
5 Gestion dynamique de la mémoire et libération de l’espace alloué
_____________________
(-10) Aucune variable globale
Qualité logicielle T.B. Bon Pauvre Référence (fichier, ligne)
5 Modularité : usage généralisé de fonctions et regroupement logique en modules
_____________________
_____________________
5 Robustesse : Précaution pour éviter les problèmes de données erronées, etc.
_____________________
_____________________
5 Documentation : Commentaires pertinents qui accélèrent la compréhension du code
_____________________
_____________________
5 Clarté du code : Code concis et court utilisant les fonctions adaptées
_____________________
_____________________
60 TOTAL
Section réservée au correcteur :
/ 10 Organigramme
/ 30 Évaluation orale, réponses aux
questions
/ 60 Respect des spécifications
/ 100 Total