Enveloppe convexe

publicité
Enveloppe convexe - Diagramme de Voronoï – Problème de proximité
Enveloppe convexe
Étant donné un ensemble E de points, l’enveloppe convexe de E est la frontière du plus petit ensemble convexe contenant E.
Dans ce chapitre, nous ne considérons que l’espace à 2 dimensions (le plan) et nous supposons que E contient un nombre fini
n>2 de points.
Étant donné que l’enveloppe convexe de E est totalement déterminée pas la suite ordonnée de ses points extrêmes, il suffit
d’identifier les points extrêmes de E, puis de les ordonner.
Propriété
pE est un point extrême de E si aucun triplet de sommets de E ne constitue un triangle contenant p
On peut donc déterminer si un point pE est extrême en O(n3), ce qui signifie qu’on peut déterminer tous les points extrêmes
en O(n4). On peut ensuite déterminer un point intérieur (par exemple le barycentre) et trier ensuite les points extrêmes selon
l’angle qu’ils forment avec ce point intérieur. Ce tri se fait en O(n log2n), ce qui nous donne un algorithme de construction de
l’enveloppe convexe de E en O(n4).
Propriété
𝑥1 𝑦1 1
Soient p1=(x1,y1), p2=(x2,y2), p3=(x3,y3) trois points de E. Soit D = det (𝑥2 𝑦2 1) qu’on va noté det(p1,p2,p3).
𝑥3 𝑦3 1
Alors D≤0 si et seulement si les points du triangle (p 1,p2,p3) sont ordonnées dans le sens des aiguilles d’une montre.
Algorithme de Graham (1972) (pour la construction de l’enveloppe convexe de E)
1. Déterminer un point intérieur q de E
Soit START le point le plus à droite parmi les plus bas dans E. Trier les points p de E selon l’angle que les segment
(q,p) forme avec le segment (q,START). Notons S(p) et P(p) le successeur et le prédécesseur de p dans cette liste.
2. p = START
Tant que S(p)≠START faire
Si det(p,S(p),S(S(p))) > 0 alors p ← S(p)
Sinon
S(p) ← S(S(p)); P(S(p)) ← p;
Si p ≠ START alors p ←P(p)
La première partie de cet algorithme est en O(n log2n) et la deuxième en O(n), pour une complexité totale de O(n log2n).
Paire de points la plus rapprochée
Comment déterminer la paire de points la plus rapprochée dans E. Une méthode naïve consiste à calculer la distance entre toute
paire de nœuds, ce qui donne un algorithme en O(n2). On peut faire mieux.
À une dimension, le problème est simple. En effet, il suffit de trier les points de E de la gauche vers la droite. On divise ensuite
E en 2 parties E1 et E2, avec E1 contenant les |E|/2 points les plus à gauche. Soit i la plus courte distance entre 2 points de Ei
et soit 3 la distance entre le point le plus à droite de E1 et le point le plus à gauche de E2. La plus courte distance entre deux
points de E est alors min{1,2,3}.
Le tri initial se fait en O(n log2n). Soit t(n) le temps de calcul du reste de cet algorithme. On a donc t(n)=2t(n/2)+cn, ce qui
donne une complexité totale de O(n log2n). On peut utiliser une stratégie similaire dans le plan. Supposons qu’on dispose de 2
liste triées des points de E, l’une par ordre croissant des coordonnées x et l’autre par ordre croissant des coordonnées y.
Algorithme PaireLaPlusProche (input E; output )
Si E contient moins de 4 points alors déterminer la plus courte distance  en comparant toutes les distances.
Sinon
Créer E1 = ensemble des ⌊|E|⁄2⌋ premiers points de la liste ordonnée selon x et E2 = les autres points.
Déterminer i par des appels récursifs à PaireLaPlusProche avec les inputs Ei (i=1,2).
Soit  ← min{1,2}. Soit x1 la plus grande coordonnée x dans E1 et soit x2 la plus petite coordonnée x dans E2.
Soit A1 l’ensemble des points de E1 de coordonnée x supérieure à x2-.
Soit A2 l’ensemble des points de E2 de coordonnée x inférieure à x1+.
Chaque point aA1 a au plus 6 points bA2 tel que distance(a,b) < . Calculer ces au plus 6|A1| distances et mettre à
jour  si nécessaire.
Notons t(n) le temps requis par cet algorithme, sans compter la création des deux listes triées de points de E (selon x et y) qui
peuvent être obtenues une fois pour toute en O(n log2n).
La création de E1 et E2 se fait en O(n). Le calcul de 1 et 2 se fait en 2t(n/2).
La création de A1 et A2 se fait en O(n). Le calcul des au plus 6|A1| distances se fait en O(n) : lorsqu’on passe au prochain
point aA1, on doit reculer d’au plus 6 positions dans A2 pour trouver le premier candidat bA2.
Le temps total requis par cet algorithme est donc t(n)=2t(n/2)+cn, ce qui donne un algorithme en O(n log2n).
Pavages de Voronoï
Le locus, ou polygone de Voronoï associé à un point pE est l’ensemble des points du plan qui plus proche de p que des
autres points de E.
On peut donc construire une partition du plan en polygones de Voronoï. Cette partiton est appelée le pavage de Voronoï
associé à E. En supposant que les points de E sont en position générale, on a les propriétés suivantes
Propriétés
 tous les sommets du pavage sont de degré 3;
 tous les sommets du pavage sont le centre d’un cercle passant par 3 points de E et ne contenant aucun autre point de E;
 si qE est le plus proche voisin de pE alors il existe une arête du pavage qui sépare p de q;
 le locus associé à un point pE est infini si et seulement si p fait partie de l’enveloppe convexe de E.
Considérons le graphe dual D associé à un pavage P de Voronoï. Plus précisément, chaque polygone (face) de P correspond à
un sommet de D et deux sommets de D sont reliés par une arête si les deux faces correspondantes dans P ont une frontière
commune. Il y a donc une bijection entre E et les sommets de D. De plus, D est une triangulation de E, appelée triangulation
de Delaunay.
Propriété
Tout pavage de Voronoï de E contient au plus 2n-5 sommets et au plus 3n-6 arêtes
Preuve Chaque arête du dual D correspond à une arête de P et chaque face finie de D correspond à un point de P. Comme D
est planaire, il contient au plus 3n-6 arêtes et 2n-4 faces. On déduit donc que P a au plus 3n-6 arêtes et au plus 2n-5 sommets
(car une face de D est infinie).
Remarque L’enveloppe convexe de E peut être déterminée à l’aide du pave de Voronoï. Il suffit de parcourir les arêtes du
pavage. Dès qu’on tombe sur une demi-droite, c’est qu’elle sépare deux sommets consécutifs de l’enveloppe convexe.
Algorithme de construction du pavage de Voronoï
Trier les points de E par coordonnée x croissante.
Créer E1 = ensemble des ⌊|E|⁄2⌋ premiers points de la liste ordonnée et E2 = les autres points.
Déterminer les pavages de E1 et de E2 par des appels récursifs à cet algorithme.
Construire la chaîne du pavage de E qui sépare E1 de E2.
Ôter du pavage de E1 tout ce qui est à droite de la chaîne et du pavage de E2 tout ce qui est à gauche de la chaîne.
Algorithme de construction de la chaîne pour la fusion des pavages de E1 et de E2.
 Déterminer l’enveloppe convexe de E1 et celle de E2 à l’aide des pavages de Voronoï de E1 et E2.
 Considérer un point q intérieur à E1. On a donc la liste L1 des points extrêmes des points de E1 triée selon l’angle que
ces points forment avec q. Aussi, en parcourant la suite des points de l’enveloppe convexe de E2, on obtient les angles
extrêmes formés par ces points par rapport à q. Les deux points u et v de E2 correspondant à ces points extrêmes
divisent l’enveloppe convexe de E2 en 2 chaînes. Il faut garder celle qui forme un ensemble convexe lorsqu’on lui
ajoute uq et vq. Cette demi-chaîne que l’on garde correspond à une liste L2 de points de E2 candidats à faire partie de
l’enveloppe convexe de E. Cette liste est triée selon l’angle que les points forment avec q.
 Fusionner L1 et L2 et appliquer la 2e partie de l’algorithme de Graham pour déterminer l’enveloppe convexe de E.
Cette enveloppe convexe de E contient deux arêtes (a1,a2) et (b1,b2) qui relient un point de L1 à un point de L2.
 Choisir une de ces deux arêtes, disons (a1,a2). Supposons sans perte de généralité que ce soit la plus haute.
 Considérer la médiatrice de cette arête et poser p=a1 et q=a2. Approcher cette bissectrice des 2 pavages par le haut.
Dès qu’on rencontre une arête e d’un des 2 pavages, modifier p ou q. Plus précisément si eE1, alors e sépare p d’un
sommet p’ de E1 et on remplace p par p’. Si par contre eE2, alors e sépare q d’un sommet q’ de E2 et on remplace q
par q’. Continuer ainsi jusqu’à atteindre (b1,b2).
La construction de cette chaîne peut se faire en O(n). La partie de l’algorithme de Graham ne prend qu’un temps O(n) car on
n’a pas besoin de trier la liste des points selon l’angle qu’ils forment avec q. La construction du pavage de Voronoï se fait
donc en temps t(n)=2t(n/2)+cn, ce qui donne un algorithme en O(n log2n).
Remarque Pour déterminer la paire de points la plus rapprochée, il suffit de déterminer la distance entre toute paire de points
séparée par une arête du pavage. Ce sont en effet les seules paires candidates à être les plus proches dans E. Ainsi, on peut
déterminer la paire la plus proche en O(n log2n) puisque qu’un temps O(n log2n) est suffisant pour la construction du pavage
et un temps O(n) est suffisant pour parcourir toutes les arêtes du pavage.
Téléchargement