Enveloppe convexe d`un ensemble fini de points dans l`espace

publicité
Enveloppe convexe d’un ensemble fini de points dans l’espace
Jérôme Feret
Résumé
Nous nous intéressons aujourd’hui au calcul de l’enveloppe convexe en dimension 3. Nous voulons
modéliser, étant donné un ensemble fini S de points dans l’espace, la plus petite partie convexe de
l’espace qui contient tous les points de S. Nous savons que l’enveloppe convexe d’un ensemble fini
et non vide de points dans l’espace, est un polyhèdre convexe. Nous proposons un algorithme basé
sur la caractérisation des faces de l’enveloppe convexe.
1
Définition du problème
Définition 1.1 Soit S un ensemble de points dans un espace affine E. Nous appeleons enveloppe
convexe de S, la plus petite partie convexe de E contenant S, et nous la notons conv(S).
Question 1.1 Justifier cette définition.
Nous ne traitons que le cas où E est un espace affine et S est un ensemble fini. Dans ce cas, conv(S)
est un polyhèdre. Nous modélisons ce polyhèdre par la liste de ses faces, chaque face étant codée par
la liste de ses sommets. Nous supposons de plus, pour l’implantation, que les coordonnées des points
de S sont entières. De plus, nous supposons que S contient au moins 4 points distincts, que jamais 3
points distincts ne sont alignés, et que jamais 4 points distincts ne sont coplanaires.
2
2.1
Algorithme
Principe
Nous cherchons à construire l’enveloppe convexe de S, en caractérisant, les faces de ce polyhèdre.
Nous utilisons pour cela le théorème ci-dessous :
Theorem 2.1 Soit E un espace affine et S une partie finie de E sans que ni quatre points ne soient
jamais coplanaires, ni trois points ne soient jamais alignés, alors pour toute triplet (A, B, C) ∈ S 3 de
points distincts 2 à 2, le triangle ABC est une face de l’enveloppe convexe conv(S) si et seulement si
l’ensemble S est inclus dans un demi-espace fermé délimité par le plan (ABC).
2.2
Algorithme glouton
Nous déduisons du Thm. 2.1 l’algorithme glouton suivant, qui construit l’enveloppe convexe conv(S),
face par face :
– supposons que ABC soit une face de conv(S),
– nous savons qu’il existe un unique point D ∈ S \ {A, B, C} tel que ABD soit une face de conv(S),
ce point est en fait le minimum sur S \ {A, B, C} pour l’ordre total p définit par : p(A,B,C) (D, E)
si et seulement si, C et E sont dans un demi-espace ouvert délimité par le plan (ABD).
Ainsi, si nous connaissons une face de conv(S), nous sommes capable de construire ses faces voisines,
puis de proche en proche, nous pouvons calculer toutes les faces de l’enveloppe convexe conv(S).
2.3
Calcul de la première face
Pour déterminer un premier sommet de l’enveloppe convexe conv(S), nous prenons le point de
S, maximal pout l’ordre lexicographique sur les coordonnées, nous le notons A. Nous savons que A
est le sommet d’une face de conv(S). Nous choisissons alors un point O1 à l’extérieur de l’enveloppe
convexe conv(S). Nous cherchons alors un point B ∈ S de sortes que tous les points de S soit dans
un même demi-espace fermé délimité par le plan (AO1 B). Pour cela, nous prenons O1 et O2 tels
1
~ 1 = (1, 0, 0) et AO
~ 2 = (−1, −1, 0), puis nous calculons B, le point minimum pour la relation
que AO
p(A,O1 ,O2 ) . Nous choisissons alors un troisième point C de sortes que tous les points de S soit dans un
même demi-espace fermé délimité par le plan (ABC).
2.4
Implantation
Question 2.1 Proposer une modélisation pour les points et les vecteurs de l’espace.
Question 2.2 Écrire une procédure vector, qui prend en argument la modélisation de deux points dans
l’espace, et retourne la modélisation du vecteur formé par ces deux points.
Question 2.3 Écrire deux procédures produit_scalaire et produit_vectoriel, qui prennent en argument
la modélisation de deux vecteurs, et retournent respectivement, le produit scalaire et le produit vectoriel
de deux vecteurs modélisés.
Question 2.4 Écrire une procédure signe tel que le résultat de signe(n) est défini par :


si n = 0,
0
1
si n > 0,


−1 sinon.
Question 2.5 Écrire une fonction du_meme_cote, qui prend en argument la modélisation de cinq
points A, B, C, D et E, et qui retourne true si et seulement si les points D et E sont dans un même
demi-espace délimité par le plan (ABC).
Question 2.6 Écrire une fonction plus_proche, qui prend en argument la modélisation de cinq points
A, B, C, D et E, et qui retourne true si et seulement si pA,B,C (D, E) est défini et est vrai.
2.5
Itérateur
Toutes les arêtes de l’enveloppe convexe figurent dans deux faces de cette enveloppe. Nous allons
recourir à une liste de travail ; cette liste contiendra toutes les arêtes pour lequelles une et une seule
face à été calculée, jusqu’à maintenant.
Nous utiliserons trois ressources (M, vue, L) qui seront soit des variables globales, soit des variables
passées en argument aux procédures :
– M est la liste de la modélisation des points de S ;
– vue est une matrice telle que la valeur dans la case vue[i, j] est le nombre de faces déjà calculées
qui ont le segment délimité par les points modélisés par M [i] et M [j] comme arête ;
– L sera une liste d’arêtes à visiter, les éléments de L sont de la forme (i, j, k) avec i < j, tel que la
face délimitée par les points modélisés par M [i], M [j] et M [k] soit une face calculée de l’enveloppe
convexe conv(S).
Question 2.7 Écrire une procédure grand_angle, qui prend en argument une liste de points et 5
indices, et tel que l’appel grand_angle(M,i,j,k,l,m) retourne exactement la même valeur que l’appel
plus_proche(M[i],M[j],M[k],M[l],M[m]).
Question 2.8 Écrire une procédure pick_item, qui prend en argument un prédicat et un tableau, et
qui retourne l’indice du plus petit élément du tableau pour le prédicat.
Question 2.9 Écrire une procédure set_arete, qui prend en argument trois indices, et qui ajoute 1 aux
cases de la matrice vue qui sont associées aux arêtes délimitées par les points correspondant.
Question 2.10 Déduire une procédure convex dont le principe est le suivant :
– chaque fois qu’une face est calculée, nous ajustons la matrice vue, et nous plaçons dans la liste de
travail les arêtes dont les faces voisines n’ont pas toutes été calculées ;
– à chaque étape, nous prenons une arête dans la liste de travail, et si ce n’est pas déjà, nous
calculons sa face voisine.
2
Téléchargement