web-dev-qa-db-fra.com

Plus grand cercle à l'intérieur d'un polygone non convexe

Comment puis-je trouver le plus grand cercle qui peut tenir à l'intérieur d'un polygone concave?

Un algorithme de force brute est correct tant qu'il peut gérer des polygones avec environ 50 sommets en temps réel.

42
Plow

Un algorithme O (N log (n)):

  1. Construire le diagramme Voronoi des bords dans P. Ceci peut être fait avec, par exemple, algorithme de fortunes .
  2. Pour les nœuds de Voronoi (points équidistants à trois bords ou plus) à l'intérieur de P;
  3. Trouvez le nœud avec la distance maximale aux bords de P. Ce nœud est le centre du cercle inscrit maximum.
14
Plow

Si quiconque est à la recherche d'une mise en œuvre pratique, j'ai conçu un algorithme plus rapide qui résout ce problème pour une précision donnée et en fait une bibliothèque JavaScript. Il est similaire à l'algorithme de grille itératif décrit par @cletus, mais il est garanti d'obtenir un optimum global et est également 20 à 40 fois plus rapide dans la pratique.

Vérifiez-le: https://github.com/mapbox/polylabel

14
Mourner

Résumé: En théorie, cela peut être fait dans O(n) heure. Dans la pratique, vous pouvez le faire dans O (n log n) heure.

Diagrammes Voronoi généralisés.

Si vous considérez les sommets et les bords du polygone comme un ensemble de sites et de tesseller l'intérieur dans les "cellules voisines les plus proches", vous obtenez le diagramme "Généralisé) Voronoi. Le diagramme Voronoi est composé de nœuds et de bords les reliant. Le Clairance d'un nœud est la distance à ses faces de polygone définissant.

Voronoi diagram of a polygon
[.____] (Ici, le polygone a même des trous; le principe fonctionne toujours.)

L'observation de la clé est maintenant que le centre du cercle inscrit maximum touche trois faces (sommets ou bords) du polygone, et aucun autre visage ne peut être plus proche. Le centre doit donc se situer sur un nœud Voronoi, c'est-à-dire le nœud avec le plus grand dédouanement.

Dans l'exemple ci-dessus, le nœud qui marque le centre du cercle inscrit au maximum touche deux bords et un sommet du polygone.

L'axe médial, au fait, est le diagramme Voronoi avec ces arêtes Voronoi enlevées qui émanent des sommets réflexes. Par conséquent, le centre du cercle inscrit au maximum réside également sur l'axe médial.

Source: A Article de blog de la mine qui traite des généralisations de cercles inscrits maximum à un moment donné. Vous pouvez y trouver plus sur les diagrammes de Voronoi et leur relation avec des cercles inscrits maximum.

Algorithmes et implémentations.

Vous pourriez réellement calculer le diagramme Voronoi. Fortune, un algorithme deplin pour les diagrammes de Voronoi, SOCG'86. Tenue a publié le package logiciel Vroni avec une complexité de temps O (N log n) attendue, qui calcule également le cercle inscrit au maximum. Et il semble y avoir une implémentation dans Boost ​​aussi.

Pour des polygones simples (c'est-à-dire sans trous) un algorithme optimal temporel qui fonctionne dans O(n) Le temps est dû à Chin et al., Trouver la médiale Axe d'un simple polygone en temps linéaire , 1999.

force brute.

Cependant, comme vous l'avez dit que vous alliez bien avec un algorithme de force brute: qu'en est-il de simplement essayer tous les triplets de sites (sommets et bords). Pour chaque triplet, vous trouverez des nœuds Voronoi candidats, c'est-à-dire équidistant LOCI vers les trois sites et vérifiez si tout autre site intersecterait le cercle maximum inscrit candidat. S'il y a une intersection, vous renvoyez le candidat. Prenez le plus grand que vous puissiez trouver sur tous les triplets.

Voir le chapitre 3 dans mon Master thèse À propos de plus de détails sur l'informatique Equidistant Logi pour trois sites.

7
S. Huber