Problem z quad / octree w wyszukiwaniu najbliższych sąsiadów polega na tym, że najbliższy obiekt może znajdować się w poprzek podziału między węzłami. W przypadku kolizji jest to w porządku, ponieważ jeśli nie ma go w węźle, nie obchodzi nas to. Ale rozważ ten przykład 2D z quadtree:
Tutaj, mimo że czarny przedmiot i zielony przedmiot znajdują się w tym samym węźle, czarny przedmiot jest najbliżej niebieskiego przedmiotu. odpowiedź ultifinitusa może zagwarantować tylko najbliższemu sąsiadowi, że tylko każdy element w twoim drzewie jest umieszczony w najmniejszym możliwym węźle, który mógłby go zawierać, lub w unikalnym węźle - prowadzi to do bardziej nieefektywnych czworokątów. (Należy pamiętać, że istnieje wiele różnych sposobów implementacji struktury, którą można nazwać quad / octree - bardziej rygorystyczne implementacje mogą działać lepiej w tej aplikacji).
Lepszą opcją byłoby drzewo KD . Drzewa Kd mają bardzo wydajny algorytm wyszukiwania najbliższych sąsiadów , który można wdrożyć i może zawierać dowolną liczbę wymiarów (stąd wymiary „k”).
Świetna i pouczająca animacja z Wikipedii:
Największy problem z używaniem drzew KD, o ile dobrze pamiętam, polega na tym, że trudniej jest je wkładać / wyjmować, zachowując równowagę. Dlatego zalecałbym użycie jednego drzewa KD do obiektów statycznych, takich jak domy i drzewa, które są wysoce zrównoważone, a drugiego zawierającego graczy i pojazdy, które wymagają regularnego równoważenia. Znajdź najbliższy obiekt statyczny i najbliższy obiekt mobilny i porównaj te dwa.
Wreszcie drzewa kd są stosunkowo łatwe do wdrożenia i jestem pewien, że można znaleźć w nich wiele bibliotek C ++. Z tego, co pamiętam, R-drzewa są znacznie bardziej skomplikowane i prawdopodobnie przesadzają, jeśli wszystko, czego potrzebujesz, to proste wyszukiwanie najbliższego sąsiada.