Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Octree oder kdtree? [C++] (https://www.delphipraxis.net/135773-octree-oder-kdtree-%5Bc-%5D.html)

Nikolas 17. Jun 2009 17:53


Octree oder kdtree? [C++]
 
Hallo

Ich entwickle gerade eine Anwendung in der ich recht viele (5000) Punkte im R3 habe und für einen beliebigen neuen Punkt den Nachbar suche. Die Suche nach dem Nachbar ist sehr zeitkritisch, die Punktwolke ist konstant, d.h. die Zeit zum Einfügen oder Entfernen von Punkten, optimieren usw, ist egal.

Trivial in O(n) wäre ein bischen blöd, deswegen habe ich mich ein bischen umgeschaut und bin auf octrees und kdtrees gestoßen.
Da die ganze Anwendung in C++ geschrieben wird habe ich noch ein bischen gesucht und bin auf den libkdtree++ gestoßen, der sich eigentlich recht gut anhört. Bei den Octrees habe ich keine Implementation gefunden, die auch ein find_nearest() unterstützt. Eine eigene Implementation will ich nicht machen, da das Hauptproblem der Anwendung eigentlich wo anders liegt und ich zu wenig Zeit habe, alles selber zu schreiben.

Eine Alternative wäre ein 3d-Grid über die Wolke zu legen. Wenn meine Wolke 1m^3 groß ist, könnte ich zum Beispiel 1000 1dm^3 große Kistchen bauen und in jeder Kiste notieren, welche Punkte darin liegen. Wenn ich dann zu einem Punkt seinen Nachbarn suche, schau ich nach, in welche Kiste der Punkt liegt und überprüfe alle anderen Punkte darin. Wenn der Punkt dann einen geringeren Abstand zu einer der Wände als zum bis dahin nächsten Nachbarn hat, muss ich auch die Punkte in der anderen Kiste betrachten.

Bei den Bäumen läuft die Suche nach dem Nachbar in O(log N) (N =#Punkt in der Wolke), in der Grid-Version in O(?*n) mit (n= durchschnittliche # Punkte pro Kiste und ?=etwas das die WKeit beschreibt, noch mehr Kisten zu durchsuchen). Da ich Punkte, deren Nachbar mehr als grob 20cm entfernt ist, ignorieren kann, könnte ich sogar auf ein WorstCase verhalten von O(9*n) kommen. (Wobei die Frage ist, ob das besser als O(log N) ist.


Ich weiss leider nicht, was da schneller ist (an die Implementierung des Grids setze ich mich gleich) und hoffe, dass jemand von euch das Problem schon mal hatte und sich mit sinnvollen Gründen für eine Idee entschieden hat. (Wer auch noch eine gute C++ implementation kennt, ist natürlich auch gerne gesehen)

Nikolas

Sternkucker 29. Jan 2010 21:46

Re: Octree oder kdtree? [C++]
 
Hallo Nikolas und DP-Leser,

das Thema ist schon etwas älter, aber ich suche momentan exakt das gleiche, aber für Delphi. Ich habe 2 Implementierungen für C++ gefunden, aber rein gar nichts in Pascal/Delphi. Kann jemand weiterhelfen?

Liebe Grüße
Michael

Torpedo 29. Jan 2010 22:58

Re: Octree oder kdtree? [C++]
 
Du könntest versuchen es zu übersetzen. C/C++ ist nicht so kompliziert, vor allem, wenn man es nur lesen muss.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz