Obecnie piszę KDTree dla silnika fizyki (projekt Hobby).KDTree Dzielenie
KDTree nie zawiera punktów. Zamiast tego zawiera wyrównane do osi ramki ograniczające różne obiekty w otoczeniu.
Mój problem polega na decydowaniu o tym, jak rozdzielić węzły KDTree, kiedy się rozładują. Próbuję 2 metody:
Metoda 1: Zawsze podziel węzeł dokładnie w połowie na największej osi.
- Ma to zalety dość równomiernie rozłożonego drzewa.
- Duża wada: Jeśli obiekty są skoncentrowane na małej powierzchni węzła, tworzone będą nadmiarowe podziały. Dzieje się tak dlatego, że wszystkie woluminy są podzielone dokładnie na połowę.
Metoda 2: Znajdź obszar węzła, który zawiera obiekty. Podziel węzeł na płaszczyźnie, która podzieli ten obszar na pół na jego największą oś. Przykład - Jeśli wszystkie obiekty są skoncentrowane na dnie węzła, dzieli się on długością, dzieląc dno na dwie części.
- To rozwiązuje problem z powyższą metodą
- Przy indeksowaniu coś, co istnieje na tej samej płaszczyźnie (terenu), na przykład, tworzy długi i wąski węzłów. Jeśli mam później dodać inne obiekty, które nie znajdują się na tej samej płaszczyźnie, te wydłużone węzły zapewniają bardzo słabe indeksowanie.
To, czego szukam, to lepszy sposób na podzielenie węzła drzewa KD. Biorąc pod uwagę, że to będzie silnik fizyki, decyzja musi być na tyle prosta, aby była podejmowana w czasie rzeczywistym.
"Kadrowany" papier SAH, o którym wspomniałeś, może być "Szybka budowa kd-drzewa z adaptacyjną heurystyką z błędami" autorstwa Hunta, Marka i Stoll. Podstawową ideą tego artykułu jest użycie przybliżonych kwadratowych aproksymacji do prawdziwej funkcji SAH poprzez inteligentne jej pobieranie. Z mojego doświadczenia wynika, że jest to szybki i skuteczny algorytm. – vedantk
Tak, to wygląda jak ten. – celion