Feststellen, ob das Entfernen eines Voxels eine Gruppe auflöst


8

Ich habe die folgende Situation: Ich habe ein 3D-Raster von Voxeln (Ein / Aus, die maximale Größe beträgt wahrscheinlich 128x128x128). Ich weiß im Voraus, dass innerhalb des Gitters alle eingeschalteten Voxel miteinander verbunden sind und eine einzige Gruppe bilden.

Jetzt muss ich feststellen: Wenn ich ein Voxel entferne (ausschalte), wird es die Gruppe auflösen?

Meine ursprüngliche Idee war es, die Nachbarn des entfernten Voxels zu untersuchen und festzustellen, ob sie noch durch andere Voxel miteinander verbunden sind (siehe meine andere Frage: Algorithmus, um festzustellen , ob zwei Voxel miteinander verbunden sind ). Aber es könnte bessere / andere Möglichkeiten geben, dies zu tun.

Was wäre also ein guter Weg, um festzustellen, ob das Entfernen eines Voxels die Gruppe, zu der es gehört, auflöst?

Antworten:


4

Ich habe dies in meinem anderen Kommentar etwas behandelt, aber ich denke, hier denken Sie über eine externe / interne Klassifizierung nach. Indem Sie ein Voxel entfernen, ändern Sie die Voxel um es herum in Randvoxel (sofern dies nicht bereits geschehen ist). Dies sollte sich auf 3 tatsächliche Fälle beschränken (Symmetrie bringt Ihnen den Rest) - im folgenden Beispiel sind die Zahlen die Gruppen-IDs, das - ist das zu entfernende Voxel

11      2    
1-     1-     1-2
  • Der erste Fall ist trivial - es ist eine Ecke, aber die Voxel über und links bleiben durch das andere Voxel vollständig verbunden.

  • Der zweite Fall: Es ist eine Ecke und das entfernte Voxel hat die oben genannten und linken Voxel, die zuvor verbunden waren, getrennt

  • Der dritte Fall: Es ist eine Linie, und das entfernte Voxel hat die zuvor verbundenen linken und rechten Voxel getrennt.

Wenn Sie feststellen, dass der 2. oder 3. Fall aufgetreten ist, müssen Sie eine Pfadfindung durchführen, um festzustellen, ob 1 und 2 noch über ihre anderen benachbarten Voxel verbunden sind.

Hier können Sie jedoch eine gewisse Effizienz erzielen. Wenn ein Voxel vollständig gruppenintern ist (dh alle 8 Nachbarn gehören derselben Gruppe an), kann es abgezinst werden. Warum? Es ist eine Topologiesache. Stellen Sie sich den 2D-Fall vor - es gibt nur zwei Möglichkeiten. Entweder gibt es eine einzelne Kante, die unabhängig davon, wie sie sich dreht und dreht, immer noch einen Voxelring bildet. Oder es gibt zwei Ringe, von denen einer ein Voxel und einer den anderen enthält. Z.B:

 xxx xxx
 x x-x x
 xxx xxx

oder

 xxxxxxx
 x     x
 xxx xxx
   x-x 
 xxx xxx

Das sollte sich auch auf 3D erstrecken, außer dass Sie anstelle eines Grenzrings eine Grenzfläche haben würden. Wenn Sie also feststellen möchten, ob die beiden kürzlich getrennten Voxel noch verbunden sind, können Sie alle internen Voxel von Ihrer Durchquerung ausschließen, da dies per Definition auch der Fall ist, wenn ein Voxel mit einem der Grenzvoxel einer Gruppe verbunden ist verbunden mit allen internen Voxeln in dieser Gruppe.

Es ist eine Art umgekehrter Effekt der Hub-Voxel, über die ich in meiner Antwort auf die andere Frage gesprochen habe - Sie müssen nicht den Weg von jedem Voxel zu jedem anderen Voxel finden, sondern nur den Weg zu den interessanten Voxeln.


Vielen Dank, nur die Verwendung der Voxel an der Oberfläche des Volumens scheint eine sehr gute Optimierung zu sein.
Bram Vaessen

3

Wenn Sie A * verwenden, können Sie es hier verwenden.

Beginnen Sie mit einer Liste der Voxel, die mit dem entfernten Voxel verbunden waren. Beginnen Sie mit dem ersten in der Liste und verwenden Sie A *, um einen Pfad zum zweiten in der Liste zu finden. Wenn ein Pfad vorhanden ist, suchen Sie einen Pfad vom zweiten zum dritten, dritten zum vierten usw.

Die meisten dieser Suchvorgänge werden sehr schnell sein, da die Voxel direkt nebeneinander liegen. Wenn ein Pfad fehlschlägt, bedeutet dies, dass eine Diskontinuität erstellt wurde.

Dies sollte ziemlich einfach zu implementieren sein, wenn Sie die A * -Funktionalität bereits implementiert haben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.