Der schnellste Weg, um das nächstgelegene Maschendreieck vom angegebenen Punkt aus zu finden

7

Ich habe zwei Dreiecksnetze (nennen wir sie A und B). Die Maschen können sehr groß sein (10.000 - 100.000 Polygone). Ich möchte für jeden Punkt in A das nächste Dreieck aus Netz B finden.

Gibt es einen schnellen Weg, dies zu tun? Gibt es eine nahezu Echtzeitlösung?

Ich habe mehrere Artikel gefunden, die beschreiben, wie man die Entfernung von einem Punkt zu einem Dreieck findet, und ich weiß ein wenig über kd-tree / bvh-tree. Daher kann ich möglicherweise mehrere Dreiecke finden, die nahe genug am angegebenen Punkt liegen, und dann kann ich das Dreieck mit roher Gewalt finden.

Aber ich denke, dass diese Methode nicht schnell genug sein wird.

Dark_Daiver
quelle

Antworten:

7

Erstellen Sie einen Octree und fügen Sie in jede Blattzelle die Liste aller Dreiecke von B ein, die die Zelle schneiden. Markieren Sie auf jeder Ebene, ob die Zelle leer ist oder nicht. Wenn eine Zelle auf einer Ebene nur 1 Poly hat, notieren Sie die Poly, damit Sie die Suche frühzeitig beenden können (große Boden- / Wanddreiecke). Sie können Zellen so lange unterteilen, bis Sie eine angemessene Anzahl von Dreiecken in jeder Zelle haben.

Suchen Sie mit dem Octree die nächste nicht leere Zelle.

Suchen Sie das nächstgelegene Dreieck in dieser Zelle und notieren Sie den Abstand.

Für jede nicht leere Zelle, die sich innerhalb dieses Abstands befindet: Suchen Sie das nächstgelegene Dreieck in diesen Zellen, halten Sie den nächstgelegenen Abstand ein und ignorieren Sie jedes Mal Zellen, die weiter entfernt sind.

Der Grund für diese letzte Iteration ist, dass ein Dreieck am anderen Ende einer Zelle möglicherweise weiter entfernt ist als ein Dreieck in einer Nachbarzelle.

Wenn Sie mehr Geschwindigkeit benötigen, können Sie dies mit GPGPU (z. B. OpenCL) verwenden, um sowohl den Octree zu erstellen als auch alle Punkte von A parallel zu durchlaufen, sobald Ihr Octree erstellt wurde.

Beachten Sie, dass die GPGPU-Leistung zwischen den GPUs stark variiert. Was also Echtzeit ist, ist möglicherweise kaum schneller (oder sogar langsamer) als die CPU.

Stephane Hockenhull
quelle