Richtige Datenstruktur und Algorithmus für die 3-D-Delaunay-Triangulation

8

Ich habe einen schlechten Code ausgearbeitet, um das Ziel der 3D-Delauney-Triangulation zu erreichen (zufällige Punkte in E3), aber der Zeitaufwand ist enorm, und wenn fünf Punkte genau (oder fast aufgrund des Rundungsfehlers) auf einer Kugel liegen, Mein Code kann mit dieser Situation nicht richtig umgehen.

Ich benutze die grundlegende Datenstruktur, die eine Liste von Tetraedern und eine Liste von Punkten und eine Liste der Beziehung von Tetraedern zu ihrer Nachbarschaft ist. Der Algorithmus ist inkrementelles Einfügen.

Kann mir jemand sagen, welche Arten von Datenstrukturen und Algorithmen ich bevorzugen sollte? Kann eine Quad-Edge-Datenstruktur in der Situation verwendet werden? Wenn ich Artikel zu diesem Thema lese, stelle ich fest, dass diese Datenstruktur möglicherweise nicht für 3D-Anwendungen geeignet ist (genau genommen nicht für 3D-Verteileranwendungen geeignet? Ich weiß nur, was gestern vielfältig ist. Bitte helfen Sie mir ...). Ist Divide-Conquer ein besserer Algorithmus? Vielen Dank!

Mengxie
quelle
1
Willkommen bei SciComp. Ihre Frage sieht für dieses Forum echt aus. Vielleicht können Sie ein wenig an der Klarheit und Formatierung Ihres Beitrags arbeiten, was die Chancen auf eine schnelle und lehrreiche Antwort verbessert.
Januar
Probieren Sie Voro ++ aus: math.lbl.gov/voro++ Der Code ist frei verfügbar (und kann geändert werden), und ich glaube, Sie können die Delaunay-Triangulation daraus erhalten. (Oder Zeo ++ maciejharanczyk.info/Zeopp für weitere Funktionen).
Nick
@ Jan, Entschuldigung für mein schlechtes Englisch, ich habe diesen Beitrag mit Hilfe des Wörterbuchs beendet, danke für deinen Beitrag!
Mengxia

Antworten:

4

Dies ist in qhull implementiert, das von scipy (Python) erhältlich ist. Wenn Sie diese Implementierungen aus irgendeinem Grund nicht direkt verwenden können, können die Erläuterungen zu den Datenstrukturen in den Dokumenten hilfreich sein.

http://www.qhull.org/

http://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.Delaunay.html#scipy.spatial.Delaunay

Clipper
quelle
Der von Ihnen angegebene Link enthält nur 2D-Beispiele. Die 3D-Datenstruktur ist erheblich schwieriger.
Shuhao Cao
Der von Ihnen angegebene qhull-Link verweist auch nicht auf die Seite zur Erklärung der Datenstruktur. Nach Stackexchange-Standard ist dies eine typische -1-Antwort.
Shuhao Cao
Hallo, @ShuhaoCao, können Sie mir eine bessere Implementierung der 3D-Delaunay-Triangulation nennen?
Mengxia
@clipper, danke für deinen Beitrag, ich werde die Dokumente lesen.
Mengxia
Der wichtige Teil ist im Attribut Abschnitt: Punkte, Vereinfachungen, Nachbarn, Gleichungen
meawoppl
0

Die Datenstruktur in 3D ist rein algebraisch.

Was Sie brauchen, sind die folgenden Arrays:

  • Vertex V(# of vertices)×3xyz

  • Element to Vertex E2V(# of tetrahedra)×4V

  • Face to Vertex F2V(# of faces)×3V

  • Edge to Vertex F2V(# of edges)×2V

Die ersten beiden sind notwendige Datenstrukturen , alle anderen Arrays können mit algebraischen Operationen aus den ersten beiden generiert werden. Andere bemerkenswerte Arrays sind Element to Edge, Face to Edge, Vertex to Element(die Elemente eine Vertex - Sharing), Face to Element(die Elemente ein Gesicht - Sharing), Edge to Face(die Flächen eine Kante teilen) usw.

Die Implementierung der 3D-Delaunay-Triangulation klingt nicht so trivial wie die andere Antwort. Abhängig von Ihrer interessierenden Software kann ich meine Antwort mehr aktualisieren.

Shuhao Cao
quelle
Vielen Dank für Ihren Beitrag. Die Datenstruktur, die ich verwendet habe, war fast dieselbe wie oben. Ich fand es schwierig, die benachbarte Beziehung der Tetraeder zu bestimmen. Der von mir verwendete Algorithmus war inkrementelle Einfügung, und dieses Mal möchte ich a ausprobieren Besserer Weg .. Entschuldigung für mein schlechtes Englisch.
Mengxia
Was für eine Nachbarschaftsbeziehung meinst du? Möchten Sie alle Tetraeder finden können, die Nachbarn eines bestimmten Tetraeders sind? Oder möchten Sie herausfinden, welche Knoten Nachbarn eines bestimmten Knotens sind?
Daniel Shapero
@mengxia Hast du das Array von Gesicht zu Element? Wenn Sie das haben, sind die Nachbarelemente relativ leicht zu finden.
Shuhao Cao
HI, @ DanielShapero, danke für deinen Beitrag, ich möchte die Beziehung des Tetraeders
Mengxia
Hi , @ ShuhaoCao , Ich habe meinen Code fertiggestellt und die Arrays, die ich bevorzugte, waren V, E2V, E2f (Elemente zu Gesicht), E2N (Element zu ihren Neiboren), aber es gab kein Kantenarray. Der Code läuft ineffizient und Speicher teuer. Was ist die Verwendung des Edge-Arrays? Wenn ich dieses Array verwende, würde mein Code schneller oder effizienter? Vielen Dank!
Mengxia