• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Ciekawy pomysł na algorytm sprawdzania kolizji

Object Storage Arubacloud
0 głosów
273 wizyt
pytanie zadane 25 marca 2017 w C i C++ przez Pajdas Mądrala (5,930 p.)
edycja 25 marca 2017 przez Pajdas

Ostatnio chce zrobić funkcje sprawdzającą kolizje AABB. Jeżeli sprawdzałbym kolizje każdego obiektu z każdym to instrukcji do sprawdzenia było by bardzo wiele. Szukając odpowiedzi natrafiłem na sposób polegający na dzieleniu obiektów na strefy aby nie sprawdzać kolizji obiektów z wielu różnych stref. Podczas rozmyślania jak zliczać te obiekty w strefach natknąłem się na pewien pomysł.

Aktualny algorytm sprawdzania kolizji wygląda tak:

Sortuję pozycje X obiektów za pomocą quicksort.

Sprawdzam czy obiekt nr.0 i obiekt nr.1 nie kolidują ze sobą (na osi X)
{ jeżeli nie - obiekt 0 nie koliduje z niczym }
{ jeżeli tak - obiekt 0 koliduje z 1 i może kolidować z innymi obiektami np. 2, 3 i 4
      sprawdzam więc czy nie koliduje z nimi dopóki zwróci false } //później wyjaśnię dlaczego 'dopóki'

{ zbieram grupę obiektów które mogą ze sobą kolidować (strefę) i powtarzam wszystko tylko w osi Y i nie wszystkie ale te ze stref }

Po co to robię:
   

Na początku ustawiam obiekty o pozycji X od najmniejszej do największej.
W tablicy std::vector zwracam się do nich za pomocą cyfr (tablica[1] itp. //na rysunku numerowałem bez zera)

Sprawdzam kolizje obiektu 1 i 2 i zwraca true, więc oba obiekty 'wkładam' do nowego std::vector żeby sprawdzić ich kolizję na osi Y, robię to późnij a teraz kontynuuję. Jeżeli teraz sprawdziłbym kolizje 2 i 3 to nie odkryłbym, że 3 koliduje z 1, więc kiedy tylko 1 koliduje z 2 to sprawdzam kolizję z następnymi tj. 3 i 4, zatrzymuję się na 4 bo 1 nie koliduje z 4 (na rysunku separacja oznaczona zieloną osią). Gdyby 2 kolidowało z 3 to musiałbym się upewnić, że 2 nie koliduje z 4. Aby dokładnie zrozumiałeś o co mi chodzi napiszę ci listę instrukcji

Cyfry będą tu obiektami

sprawdzam 1 i 2 - true
sprawdzam 1 i 3 - true
sprawdzam 1 i 4 - false
ponieważ 1 i 4 to false to wiem, żeby sprawdzić kolizję 1 tylko z 2 i 3, bo z innymi nie ma prawa kolidować
sprawdzam 2 i 3 - false
2 na pewno nie koliduje z 3 więc nie koliduje z niczym innym ( 2 nie koliduje z 1, tylko 1 z 2 smiley)

na koniec sprawdzam czy 3 nie koliduje z 4 - false

wyniki:
1 koliduje na osi X z 2 i 3
      wywołuję sprawdzenie kolizji z 2 - false
      wywołuję sprawdzenie kolizji z 3 - true - 1 koliduje z 3
przy 2, 3 i 4 nie wywołuję sprawdzenia kolizji.

 

Po co to piszę.
Nie wiem jak zaimplementować ten algorytm, nie oczekuję gotowca ale pomoc, poradę, może widzicie tutaj możliwość wykorzystania jakiejś struktury danych, może mój algorytm jest nie efektywny.

Napiszcie, jeżeli są lepsze sposoby sprawdzania kolizji, co sądzicie o moim itd.

Zapraszam do rozmowy, jestem otwarty na rady i krytykę
 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 956 wizyt
pytanie zadane 22 października 2019 w C# przez niezalogowany
0 głosów
1 odpowiedź 452 wizyt
pytanie zadane 19 października 2018 w Java przez DuduśToJa Początkujący (290 p.)
0 głosów
1 odpowiedź 284 wizyt
pytanie zadane 9 lutego 2018 w Nasze projekty przez thryndl Nałogowiec (30,470 p.)

92,572 zapytań

141,422 odpowiedzi

319,645 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...