Algorithme de Bowyer-Watson
From Wikipedia, the free encyclopedia
En géométrie algorithmique, l'algorithme de Bowyer-Watson est une méthode pour calculer la triangulation de Delaunay d'un ensemble fini de points dans un espace euclidien de dimension quelconque[1].
Il est parfois appelé « algorithme de Bowyer » ou « algorithme de Watson », Adrian Bowyer et David Watson l'ayant indépendamment découvert et publié dans le même numéro du Computer Journal en 1981[1],[2].
Initialisation
- Première étape : insertion d'un point dans un « super-triangle » englobant.
- Insertion d'un second point.
- Insertion d'un troisième point.
- Insertion d'un quatrième point.
- Insertion d'un cinquième (et dernier) point.
- Suppression des arêtes du super-triangle.
L'algorithme de Bowyer-Watson est un algorithme itératif. Il procède en ajoutant des points, un à la fois, à une triangulation de Delaunay valide du sous-ensemble des points. Après chaque insertion, tous les triangles dont le cercle circonscrit (en jaunes dans les figures ci-dessus) contient le nouveau point sont supprimés, laissant un trou polygonal « étoilé » (en rouge) qui est alors re-triangulé (en vert) en utilisant le point suivant.
Super-Triangle
Les points à trianguler doivent être compris dans un triangle englobant.
Un tel triangle peut être le triangle dont le cercle inscrit est le cercle minimal englobant.
Plus simplement, dans un espace à 2 dimensions, pour un ensemble de points , le triangle , , englobe tous ces points. En effet, par réduction d'échelle et translation tous les points peuvent être ramenés dans le carré , compris dans le triangle .
Trou polygonal
Les arêtes du trou polygonal résultant de la suppression des triangles sont les arêtes des mêmes triangles dont le triangle opposé (le triangle partageant la même arête) est soit absent (bord du super-triangle) soit parmi les triangles à conserver.
Un parcours des arêtes dans le sens trigonométrique permet de sélectionner les arêtes du trou polygonal dans le sens trigonométrique:
- à partir d'un triangle à supprimer aléatoire et d'une de ses arêtes.
- trouver le triangle opposé :
- si ce triangle existe et fait partie des triangles à supprimer: sélectionner ce triangle et la prochaine arête sur ce triangle dans le sens trigonométrique
- sinon ajouter l'arête et l'ajouter à la construction du polygone, puis sélectionner la prochaine arête du triangle dans le sens trigonométrique
- continuer le parcours des arêtes tant que le polygone n'est pas fermé
triangles = [...]
englobant = []
triangle_supprimer = [...]
triangle = triangle_supprimer[0]
arete = (triangle[0], triangle[1])
while not polygone_ferme(englobant):
t_voisin = triangles.triangle_oppose(arete)
if t_voisin in triangle_supprimer:
triangle = t_voisin
arete = t_voisin.prochaine_arete(arete)
else:
englobant.append(arete)
arete = triangle.prochaine_arete(arete)