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.
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.
quelle