Niewielkie doświadczenie w zakresie dotychczasowych decyzji dotyczących projektowania ... Opracowałem ośmioetapową strukturę, która może przechowywać punkty. Zdecydowałem się ograniczyć rekurencję "pokoleń" w oparciu o pewien bazowy rozmiar woksela. Węzły potomne są tworzone tylko po dodaniu punktów do tego węzła. Jest to , a nie dynamiczna aplikacja graficzna - ta oś i obiekty w niej zawarte są statyczne, więc wstępne przetwarzanie w celu poprawy wydajności nie jest problemem.Gdzie przechowywać kształty w ośmiu?
Teraz chciałbym dodać "kształty" do mojej ósemki - konkretnie, siatkę powierzchni złożoną z trójkątów. Wierzchołki tych trójkątów nie odpowiadają punktom zapisanym w ósemce. Jak przechowywać te kształty w ósemce? Widzę dwie opcje ...
Szary węzły są „puste”, że nie mają one kształty. W wariancie 1 kształty są przechowywane w każdym węźle, który przecinają - tj. Węzeł 1a zawiera kształt 1 i 4c & 4d kształt2. W wariancie 2 kształty są przechowywane tylko w najmniejszym węźle, który przecinają - tj. Węzeł 1a zawiera kształt 1, a węzeł 4 zawiera kształt2.
Większość postów na temat ośmiornic, które widziałem, zakłada Alt1, ale nigdy nie wyjaśniają dlaczego. Alt2 ma dla mnie więcej sensu i stworzy tylko dodatkową pracę dla tych kształtów, które znajdują się na granicach węzłów. Dlaczego Alt1 jest lepszy?
Edytuj: Aby wyjaśnić, moim językiem używanym w implementacji jest C++, więc wolałbym przykładowe implementacje w tym języku, ale pytanie jest niezależne od języka. Przepraszam, jeśli to nieprawidłowe użycie tagu.
Edycja2: chociaż nie jest to bezpośrednio związane z kwestią przechowywania kształtów, this link ma dobrą dyskusję na temat przejścia oktree, które kryje się za pytaniem. Pomyślałem, że może pomóc każdemu, kto jest zainteresowany pracą nad tym pytaniem.
+1 Uważam, że to pytanie jest interesujące i dobrze przedstawione (i nie mam absolutnie żadnego pojęcia o odpowiedzi, po prostu mówiąc z góry). Czy słuszne jest założenie, że znacznikiem C++ jest twoja preferencja dla proponowanych propozycji schematów adresowania? Jeśli tak, możesz chcieć wyjaśnić to w pytaniu, chociaż zgaduję, że ktoś mógłby rozwinąć odpowiedź w Forth i prawdopodobnie z łatwością to przeanalizowałbyś. Jak napisano, byłby ładnie niezależny od tagu języka. – WhozCraig
Powodem Alt1 jest domniemana precyzja. Testy aabb oktree są wykonywane szybciej niż na testy w trójkącie. W związku z tym precyzyjniejsze ósemki z wieloma rejestracjami tej samej siatki pozwolą na szybsze zapytania. Podobnie jak w log n w porównaniu do n, pod względem złożoności. Ale z drugiej strony ma więcej pamięci niż Alt2. Dodatkowo dla nie statycznej geometrii aktualizacje są droższe niż w alt2. Ogólnie rzecz biorąc wybór rodzaju podsegmentu zależy od rodzaju sceny, z którą masz do czynienia. Ilość obiektów i zmienność odgrywają równe role (i pamięć). – meandbug
@WhozCraig: Flaga C++ została uwzględniona tylko dlatego, że jest to mój język implementacji i każdy przykładowy kod byłby najlepiej zrozumiały w tym języku. Masz rację, że samo pytanie jest niezależne od języka. – Phlucious