Ändern Sie die Netzdarstellung zu Punkttabelle und Dreieck Gesichter Tabelle. STL verlangt, dass alle Dreiecke in ihren Scheitelpunkten verbunden sind, so dass keine Kanten abgeschnitten werden, was bedeutet, dass benachbarte Dreiecke immer eine vollständige Kante teilen.
double pnt[points][3];
int tri[triangles][3];
Die pnt
sollte Liste aller verschiedenen Punkten sein (Index Art es Geschwindigkeit für hohe Punktzahl zu verbessern). Die tri
sollte 3 Indizes von Punkten enthalten, die im Dreieck verwendet werden. Sortiere sie (asc oder desc), um die Spielgeschwindigkeit zu verbessern.
Nun, wenn ein Dreieck tri[i]
teilt die gleiche Kante wie tri[j]
dann sind diese beiden benachbarten Dreiecken.
if ((tri[i][0]==tri[j][0])&&(tri[i][1]==tri[j][1])
||(tri[i][0]==tri[j][1])&&(tri[i][1]==tri[j][2])) triangles i,j are neighbors
alle Kombinationen hinzufügen ...
Wenn Sie nur benachbarte Punkte dann alle Dreiecke finden in diesen Dreiecke enthalten, dass die Punkte und alle anderen Punkte sind Nachbarn
STL laden auf eine solche Struktur wie folgt vorgehen:
- klar
pnt[],tri[]
Listen/Tabellen
- Prozess jedes Dreieck von STL
für jeden Punkt des Dreiecks
prüfen es in pnt[]
ist, wenn ja seinen Index für neue triangle
verwenden. wenn nicht, fügen Sie point
zu hinzu und verwenden Sie seinen Index für neue triangle
. Wenn alle 3 Punkte erledigt sind, fügen Sie triangle
zu tri
hinzu.
Verbesserung pnt[]
Leistung
für pnt[]
von jedem zum Beispiel Koordinaten sortiert Index sortieren hinzufügen x
und verbessern die Leistung zu überprüfen, ob point
in pnt
bereits vorhanden ist.
So, während (xi,yi,zi)
in pnt[]
Fund Index von Punkt hinzufügen, der die größte x
haben die xi>=pnt[i0][0]
über binäre Suche ist und scannen Sie dann alle Punkte in pnt
bis x
Kreuze xi
so xi<pnt[i1][0]
diese Weise brauchen Sie nicht alle Punkte zu überprüfen .
Wenn dies zu langsam ist (in der Regel, wenn Anzahl der Punkte größer dann 40000 ist) Sie Leistung mehr nach Segmenten Sortier-Index verbessern können
Verbesserung (Index Art in das Segment Seiten endlicher Größe wie 8192 Punkte Dividieren) tri[]
Leistung
Sie können auch die tri[]
von tri[i][0]
sortieren, so können Sie ähnlich wie pnt[]
binäre Suche verwenden.
Was denken Sie über meine Lösung? 1- Erstellen Sie eine Dreieck-Struktur, die drei Punkte mit x, y, z-Koordinaten enthält. 2- Erstellen Sie ein Array von Dreiecken und aktualisieren Sie sie durch Lesen von Einträgen aus der STL-Datei. 3. Verwenden Sie eine unordered_multimap und eine Hash-Funktion, um alle Punkte zu einer Tabelle zu hashen. 4- für jedes Dreieck, hash seine Punkte P0, P1 und P2 und finden Sie die ID der anderen Dreiecke, die auf die gleiche Stelle in den Tabellen gehashed sind. 5- Die benachbarten Dreiecke sind diejenigen, die zwei gemeinsame Punkte in der Tabelle haben. – Arash
@Arash das ist fast das gleiche wie mein Ansatz, so sollte es funktionieren. – Spektre