Bonjour!
Dans cet article, je décrirai en détail l'algorithme que j'ai obtenu grùce à l'idée de «balayer la droite» pour construire la triangulation de Delaunay sur un plan. Il contient plusieurs idées que je n'ai jamais rencontrées en lisant des articles sur la triangulation.
Peut-ĂȘtre que quelqu'un les trouvera Ă©galement inhabituels. Je vais essayer de tout faire dans la meilleure tradition et d'inclure les choses suivantes dans l'histoire: une description des structures de donnĂ©es utilisĂ©es, une description des Ă©tapes de l'algorithme, une preuve de correction, des estimations de temps, ainsi qu'une comparaison avec un algorithme itĂ©ratif utilisant l'arbre kD.
Définitions et énoncé du problÚme
Triangulation
Ils disent que la triangulation est spĂ©cifiĂ©e sur l'ensemble des points du plan si certaines paires de points sont reliĂ©es par une arĂȘte, toute face finie dans le graphique rĂ©sultant forme un triangle, les arĂȘtes ne se coupent pas et le graphe est maximal en nombre d'arĂȘtes.

Triangulation de Delaunay
Une triangulation de Delaunay est une triangulation dans laquelle, pour tout triangle, il est vrai qu'il n'y a pas de points de l'ensemble d'origine à l'intérieur du cercle circonscrit autour de lui.

Remarque : pour un ensemble donnĂ© de points dans lesquels aucun 4 points ne se trouve sur le mĂȘme cercle, il y a exactement une triangulation de Delaunay.
La condition Delaunay
Soit une triangulation donnée sur l'ensemble des points. Nous disons qu'un certain sous-ensemble de points satisfait la condition de Delaunay si la triangulation délimitée sur ce sous-ensemble est pour lui la triangulation de Delaunay.
CritĂšre de triangulation de Delaunay
Le respect de la condition de Delaunay pour tous les points formant un quadrilatÚre dans une triangulation équivaut au fait que cette triangulation est une triangulation de Delaunay.
Remarque : pour les quadrangles non convexes, la condition de Delaunay est toujours remplie, et pour les quadrangles convexes (dont les sommets ne se trouvent pas sur le mĂȘme cercle), il y a exactement 2 triangulations possibles (dont l'une est la triangulation de Delaunay).

La tùche consiste à construire une triangulation de Delaunay pour un ensemble de points donné.Description de l'algorithme
Points visibles et bords visibles
Soit une coque convexe minimale (ci-aprÚs, MBO) d'un ensemble fini de points (bords reliant certains des points de sorte qu'ils forment un polygone contenant tous les points de l'ensemble) et un point A situé à l'extérieur de la coque. Ensuite, le point de l'avion est appelé visible pour le point A, si le segment le reliant au point A ne coupe pas le MBO.
Un bord MBO est appelé visible pour le point A si ses extrémités sont visibles pour A.
Dans l'image suivante, les bords visibles pour le point rouge sont marqués en rouge:

Remarque : le contour de triangulation Delaunay est le MBO des points sur lesquels il est construit.
Remarque 2 : dans l'algorithme, les arĂȘtes visibles pour le point ajoutĂ© A forment une chaĂźne, c'est-Ă -dire plusieurs arĂȘtes MBO d'affilĂ©e
Stocker la triangulation en mémoire
Il existe certaines mĂ©thodes standard qui sont bien dĂ©crites dans le livre de Skvortsov [1]. En raison des spĂ©cificitĂ©s de l'algorithme, je proposerai ma propre version. Puisque nous voulons vĂ©rifier les 4 gons pour l'Ă©tat de Delaunay, nous considĂ©rons leur structure. Chaque quadrangle en triangulation est composĂ© de 2 triangles ayant un bord commun. Chaque arĂȘte a exactement 2 triangles adjacents. Ainsi, chaque quadrangle en triangulation est gĂ©nĂ©rĂ© par une arĂȘte et deux sommets opposĂ©s Ă l'arĂȘte dans des triangles adjacents.
Puisque deux triangles et leur adjacence sont restaurĂ©s le long du bord et de deux sommets, nous pouvons restaurer la triangulation pour toutes ces structures. En consĂ©quence, il est proposĂ© de stocker une arĂȘte avec deux sommets dans l'ensemble et d'effectuer une recherche le long de l'arĂȘte (une paire ordonnĂ©e de sommets).

Algorithme
L'idée de la ligne de balayage est que tous les points sont triés dans une direction, puis traités à leur tour.
- Trier tous les points le long d'une ligne droite (pour plus de simplicité, par coordonnées )
- Nous construisons un triangle sur les 3 premiers points.
De plus, pour chaque point suivant, nous effectuerons des Ă©tapes qui prĂ©servent l'invariant qu'il existe une triangulation de Delaunay pour les points dĂ©jĂ ajoutĂ©s et, en consĂ©quence, un MBO pour eux. - Ajoutez les triangles formĂ©s par les bords visibles et le point lui-mĂȘme (c'est-Ă -dire, ajoutez les bords du point en question Ă toutes les extrĂ©mitĂ©s des bords visibles).
- On vĂ©rifie sur la condition de Delaunay tous les quadrangles gĂ©nĂ©rĂ©s par les bords visibles. Si la condition n'est pas remplie quelque part, nous reconstruisons la triangulation dans le quadrangle (je me souviens qu'il n'y en a que deux) et exĂ©cutons rĂ©cursivement la vĂ©rification des quadrangles gĂ©nĂ©rĂ©s par les bords du quadrangle actuel (car ce n'est qu'aprĂšs eux que la condition Delaunay pourrait ĂȘtre violĂ©e).
Remarque : Ă l'Ă©tape (4) lors d'un dĂ©marrage rĂ©cursif, vous ne pouvez pas vĂ©rifier les quadrangles gĂ©nĂ©rĂ©s par les arĂȘtes provenant du point considĂ©rĂ© Ă cette itĂ©ration (il y en a toujours deux sur quatre). Le plus souvent, ils seront non convexes, car pour la convexe la preuve est purement gĂ©omĂ©trique, je laisse le soin au lecteur. De plus, nous supposons que seulement 2 dĂ©marrages rĂ©cursifs sont effectuĂ©s pour chaque reconstruction.
Vérification d'une condition Delaunay
Les moyens de tester les quadrangles pour la condition de Delaunay peuvent ĂȘtre trouvĂ©s dans le mĂȘme livre [1]. Je note seulement que lors du choix d'une mĂ©thode avec des fonctions trigonomĂ©triques Ă partir de lĂ , avec une implĂ©mentation inexacte, des valeurs nĂ©gatives de sinus peuvent ĂȘtre obtenues, il est logique de les prendre modulo.
Rechercher les bords visibles
Reste à comprendre comment trouver efficacement les bords visibles. Notez que le point ajouté S précédent se trouve dans le MBO à l'itération actuelle, car il a la plus grande coordonnée
et est également visible pour le point actuel. Ensuite, notant que les extrémités des bords visibles forment une chaßne continue de points visibles, nous pouvons aller du point S dans les deux directions le long du MBO et collecter les bords pendant qu'ils sont visibles (la visibilité du bord est vérifiée à l'aide du produit vectoriel). Ainsi, il est pratique de stocker le MBO en tant que liste doublement connectée, à chaque itération, supprimant les bords visibles et en ajoutant 2 nouveaux à partir du point considéré.

Visualisation d'algorithme
Deux points rouges - ajoutés et précédents. Des bords rouges à chaque instant constituent la pile de récursivité de l'étape (4):

Exactitude de l'algorithme
Pour prouver l'exactitude de l'algorithme, il suffit de prouver la conservation de l'invariant aux étapes (3) et (4).
Ătape (3)
AprÚs l'étape (3), évidemment, nous obtenons une triangulation de l'ensemble actuel de points.
Ătape (4)
Dans le processus de l'Ă©tape (4), tous les quadrangles qui ne satisfont pas Ă la condition de Delaunay sont dans la pile de rĂ©cursivitĂ© (dĂ©coule de la description), ce qui signifie qu'Ă la fin de l'Ă©tape (4), tous les quadrangles satisfont Ă la condition de Delaunay, c'est-Ă -dire que la triangulation de Delaunay est rĂ©ellement construite. Il reste alors Ă prouver que le processus de l'Ă©tape (4) se terminera un jour. Cela dĂ©coule du fait que toutes les arĂȘtes ajoutĂ©es lors de la reconstruction proviennent du sommet actuel en question (c'est-Ă -dire Ă l'Ă©tape
il n'y a pas plus de
) et du fait qu'aprĂšs avoir ajoutĂ© ces arĂȘtes, nous ne prendrons pas en compte les quadrangles gĂ©nĂ©rĂ©s par celles-ci (voir la remarque prĂ©cĂ©dente), ce qui signifie que nous n'en ajouterons pas plus d'une fois.
Complexité temporelle
En moyenne, l'algorithme fonctionne assez bien sur des distributions uniformes et normales (les résultats sont présentés dans le tableau ci-dessous). On suppose que son temps de travail est
. Dans le pire des cas, une évaluation a lieu
.

Examinons le temps de travail en plusieurs parties et comprenons lequel a le plus d'impact sur le temps total:
Trier par direction
Pour le tri, nous utiliserons l'estimation
.
Rechercher les bords visibles
Tout d'abord, nous montrons que le temps total passé à rechercher des bords visibles est
. Notez qu'Ă chaque itĂ©ration, nous trouvons toutes les arĂȘtes visibles et 2 autres (la premiĂšre non visible) en temps linĂ©aire. Ă l'Ă©tape (3), nous ajoutons de nouveaux 2 bords au MBO. Ainsi, au total, pas plus de
par conséquent, et diverses cÎtes visibles ne seront plus
. Nous trouverons également
bords non visibles. Ainsi, au total, il n'y a plus
cĂŽtes qui correspondent au temps
.
Construire de nouveaux triangles
Le temps total pour construire des triangles de l'étape (3) avec des bords visibles déjà trouvés est évidemment
.
Reconstruire la triangulation
Il reste à traiter l'étape (4). Tout d'abord, notez que vérifier la condition de Delaunay et la reconstruire si elle n'est pas remplie sont des actions assez coûteuses (bien qu'elles fonctionnent pour
) Seule la vérification de la condition de Delaunay peut prendre environ 28 opérations arithmétiques. Examinons le nombre moyen de reconstructions au cours de cette étape. Les résultats pratiques de certaines distributions sont donnés ci-dessous. Pour eux, je veux vraiment dire que le nombre moyen de réarrangements augmente avec une vitesse logarithmique, mais laissons cela comme hypothÚse.

Ici, je tiens Ă©galement Ă noter que le nombre moyen de rĂ©arrangements par point peut varier considĂ©rablement en fonction de la direction dans laquelle le tri est effectuĂ©. Ainsi, pour un million uniformĂ©ment rĂ©parti sur un long rectangle bas avec un rapport d'aspect de 100000: 1, ce nombre varie de 1,2 Ă 24 (ces valeurs sont obtenues lors du tri des donnĂ©es horizontalement et verticalement, respectivement). Par consĂ©quent, je vois l'intĂ©rĂȘt de choisir la direction de tri de maniĂšre arbitraire (dans cet exemple, avec une sĂ©lection arbitraire, en moyenne environ 2 reconstructions ont Ă©tĂ© obtenues) ou de la sĂ©lectionner manuellement si les donnĂ©es sont connues Ă l'avance.
Ainsi, la durée principale du programme passe généralement à l'étape (4). S'il s'exécute rapidement, il est logique de penser à accélérer le tri.
Pire cas
Pire cas sur
e itération se produit
l'appel récursif à l'étape (4), c'est-à -dire en sommant sur tout i, nous obtenons le comportement asymptotique dans le pire des cas
. L'image suivante illustre un bel exemple sur lequel le programme peut fonctionner pendant longtemps (1100 reconstructions en moyenne lors de l'ajout d'un nouveau point avec une entrée de 10 000 points).

Comparaison avec un algorithme itératif pour construire une triangulation de Delaunay en utilisant kD-tree
Description de l'algorithme itératif
Je dĂ©crirai briĂšvement l'algorithme ci-dessus. Lorsque le point suivant arrive, nous utilisons l'arbre kD (je vous conseille de le lire quelque part, si vous ne le savez pas), nous trouvons un triangle qui est dĂ©jĂ assez proche de lui. Puis, en contournant en profondeur, nous recherchons un triangle dans lequel le point lui-mĂȘme tombe. Nous Ă©tendons les bords aux sommets du triangle trouvĂ© et effectuons rĂ©ellement l'Ă©tape (4) de notre algorithme pour les nouveaux quadrangles. Comme le point peut ĂȘtre en dehors de la triangulation, pour simplifier, il est proposĂ© de couvrir tous les points avec un grand triangle (pour le construire Ă l'avance), cela rĂ©soudra le problĂšme.
Similitude des algorithmes
En fait, si des points sont ajoutĂ©s dans l'ordre triĂ©s par direction, notre algorithme fonctionne en fait de la mĂȘme maniĂšre que l'itĂ©ratif, sauf que le nombre de rĂ©arrangements est infĂ©rieur. L'animation suivante le dĂ©montre parfaitement. Sur celui-ci, des points ont Ă©tĂ© ajoutĂ©s de droite Ă gauche, et ils sont tous couverts par un grand triangle, qui est ensuite supprimĂ©.

Différences d'algorithme
Dans un algorithme itératif, la localisation d'un point (recherche du triangle souhaité) se produit en moyenne sur
, sur les distributions ci-dessus, en moyenne, 3 réarrangements se produisent (comme indiqué dans [1]) sous la condition d'un ordre arbitraire de fourniture de points. Ainsi, la ligne de balayage gagne le temps de l'algorithme itératif en localisation, mais le perd en reconstruction (ce qui, je le rappelle, est assez difficile). De plus, l'algorithme itératif fonctionne en ligne, ce qui est également sa caractéristique distinctive.
Conclusion
Ici, je montre juste quelques triangulations intéressantes résultant du fonctionnement de l'algorithme.
Beau motif

Distribution normale, 1000 points

Distribution uniforme, 1000 points

Triangulation basée sur l'emplacement de toutes les villes de Russie


Ici vous pouvez voir un exemple de mon code pour cet algorithme:
github.com/Vemmy124/Delaunay-Triangulation-AlgorithmMerci de votre attention!Littérature
[1] Skvortsov A.V. Triangulation de Delaunay et son application. - Tomsk: maison d'édition Tom. Université, 2002 .-- 128 p. ISBN 5-7511-1501-5