web-dev-qa-db-fra.com

Comment trouver une coque convexe dans un espace tridimensionnel

Étant donné un ensemble de points S (x, y, z). Comment trouver le convex hull de ces points?

J'ai essayé de comprendre l'algorithme de ici , mais je n'ai pas pu obtenir grand-chose.

Ça dit:

Projetez d'abord tous les points sur le plan xy et trouvez un bord qui se trouve définitivement sur la coque en sélectionnant le point avec la coordonnée y la plus élevée, puis en effectuant une itération d'emballage cadeau pour déterminer l'autre point final du bord. Il s'agit de la première partie de la coque incomplète. Nous construisons ensuite la coque de manière itérative. Considérez ce premier Edge; trouver maintenant un autre point pour former la première face triangulaire de la coque. Pour ce faire, nous sélectionnons le point de telle sorte que tous les autres points se trouvent à droite de ce triangle, lorsqu'ils sont vus de manière appropriée (tout comme dans l'algorithme d'emballage cadeau, dans lequel nous avons choisi un bord de telle sorte que tous les autres points se trouvent à droite de ce bord). Maintenant, il y a trois bords dans la coque; pour continuer, nous en choisissons un arbitrairement et parcourons à nouveau tous les points pour trouver un autre point pour construire un nouveau triangle avec ce bord, et répéter jusqu'à ce qu'il n'y ait plus de bords. (Lorsque nous créons une nouvelle face triangulaire, nous ajoutons deux bords à la piscine; cependant, nous devons d'abord vérifier s'ils ont déjà été ajoutés à la coque, auquel cas nous les ignorons.) Il y a O(n) faces, et chaque itération prend O(n) temps car nous devons balayer tous les points restants, donnant O (n2).

Quelqu'un peut-il l'expliquer de manière plus claire ou suggérer une approche alternative plus simple.

18
Ninja420

La mise en œuvre de la coque convexe 3D n'est pas facile, mais de nombreux algorithmes ont été mis en œuvre et le code est largement disponible. À l'extrémité supérieure de la qualité et de l'investissement en temps à utiliser est CGAL . À l'extrémité inférieure des deux mesures se trouve mon propre code C :
DCG Cover
Entre les deux, il y a du code sur tout le Web, y compris cette implémentation de QuickHull .

18
Joseph O'Rourke

Je suggère d'abord d'essayer une approche plus facile comme la coque rapide. (Btw, l'ordre d'emballage cadeau est O(nh) pas O (n2), où h est des points sur la coque et l'ordre de la coque rapide est O (n log n))).

Dans des circonstances moyennes, la coque rapide fonctionne assez bien, mais le traitement devient généralement lent en cas de symétrie élevée ou de points se trouvant sur la circonférence d'un cercle. La coque rapide peut être décomposée selon les étapes suivantes:

  1. Trouvez les points avec les coordonnées x minimales et maximales, ceux-ci sont liés pour faire partie du convexe.

  2. Utilisez la ligne formée par les deux points pour diviser l'ensemble en deux sous-ensembles de points, qui seront traités récursivement. enter image description here

  3. Déterminez le point, d'un côté de la ligne, avec la distance maximale de la ligne. Les deux points trouvés précédemment avec celui-ci forment un triangle.

  4. Les points situés à l'intérieur de ce triangle ne peuvent pas faire partie de la coque convexe et peuvent donc être ignorés dans les étapes suivantes.

  5. Répétez les deux étapes précédentes sur les deux lignes formées par le triangle (pas la ligne initiale). enter image description here

  6. Continuez ainsi jusqu'à ce qu'il ne reste plus de points, la récursivité est terminée et les points sélectionnés constituent la coque convexe. enter image description here

Voir this impementaion et explication pour la coque convexe 3D en utilisant l'algorithme de coque rapide.

Algorithme d'emballage cadeau:

L'algorithme de correspondance de Jarvis est comme enrouler un morceau de chaîne autour des points. Il commence par calculer le point le plus à gauche l, car nous savons que le point le plus à gauche doit être un sommet de coque convexe, ce processus prendra du temps linéaire, puis l'algorithme effectue une série d'étapes de pivotement pour trouver chaque sommet de coque convexe successif jusqu'au prochain le sommet est de nouveau le point le plus à gauche d'origine.

L'algorithme trouve le sommet de coque convexe successif comme ceci: le sommet suivant immédiatement un point p est le point qui semble être le plus à droite pour quelqu'un se tenant à p et regardant les autres points. En d'autres termes, si q est le sommet suivant p et r est tout autre point d'entrée, alors le triple p, q, r est dans le sens antihoraire. Nous pouvons trouver chaque sommet successif en temps linéaire en effectuant une série de tests O(n) dans le sens antihoraire).

Puisque l'algorithme passe O(n) temps pour chaque sommet de coque convexe, le temps d'exécution le plus défavorable est O (n2). Cependant, si la coque convexe a très peu de sommets, la marche de Jarvis est extrêmement rapide. Une meilleure façon d'écrire le temps d'exécution est O (nh), où h est le nombre de sommets de coque convexes. Dans le pire des cas, h = n, et nous obtenons notre ancien O(n2) limité dans le temps, mais dans le meilleur des cas h = 3, et l'algorithme n'a besoin que de O(n) temps. Il s'agit d'un soi-disant algorithme sensible à la sortie, plus la sortie est petite , plus l'algorithme est rapide.

L'image suivante devrait vous donner plus d'idée enter image description here

14
Aditya

Le code GPL C++ pour trouver des coques convexes 3D est disponible sur http://www.newtonapples.net/code/NewtonAppleWrapper_11Feb2016.tar.gz et une description de l'algorithme O (n log (n)) sur http://www.newtonapples.net/NewtonAppleWrapper.html

4
David