Das Problem mit einem Quad / Octree bei der Suche nach nächsten Nachbarn besteht darin, dass das nächstgelegene Objekt möglicherweise genau über der Unterteilung zwischen Knoten liegt. Bei Kollisionen ist dies in Ordnung, da es uns egal ist, ob es sich nicht um einen Knoten handelt. Aber betrachten Sie dieses 2D-Beispiel mit einem Quadtree:
Hier ist der schwarze Gegenstand dem blauen Gegenstand am nächsten, obwohl sich der schwarze Gegenstand und der grüne Gegenstand im selben Knoten befinden. Die Antwort von ultifinitus kann nur den nächsten Nachbarn garantieren, nur jedes Element in Ihrem Baum wird in den kleinstmöglichen Knoten gestellt, der es enthalten könnte, oder in einen eindeutigen Knoten - dies führt zu ineffizienten Quadtrees. (Beachten Sie, dass es viele verschiedene Möglichkeiten gibt, eine Struktur zu implementieren, die als Quad / Octree bezeichnet werden kann. Strengere Implementierungen funktionieren in dieser Anwendung möglicherweise besser.)
Eine bessere Option wäre ein kd-Baum . Kd-Bäume haben einen sehr effizienten Algorithmus für die Suche nach nächsten Nachbarn , den Sie implementieren können, und können eine beliebige Anzahl von Dimensionen enthalten (daher "k" Dimensionen).
Eine großartige und informative Animation von Wikipedia:
Das größte Problem bei der Verwendung von kd-trees ist, wenn ich mich recht entsinne, dass es schwieriger ist, Elemente einzufügen / daraus zu entfernen, während das Gleichgewicht erhalten bleibt. Daher würde ich empfehlen, einen kd-Baum für statische Objekte wie Häuser und Bäume zu verwenden, der sehr ausgewogen ist, und einen anderen, der Spieler und Fahrzeuge enthält, die regelmäßig ausgewogen werden müssen. Suchen Sie das nächste statische Objekt und das nächste mobile Objekt und vergleichen Sie diese beiden.
Schließlich sind kd-trees relativ einfach zu implementieren, und ich bin sicher, dass Sie mit ihnen eine Vielzahl von C ++ - Bibliotheken finden können. Soweit ich mich erinnere, sind R-Bäume viel komplizierter und wahrscheinlich übertrieben, wenn Sie nur eine einfache Suche nach dem nächsten Nachbarn benötigen.