Bilard - ogólny algorytm wykrywania kolizji

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
PL_kolek
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 113
Rejestracja: 30 sty 2008, 21:46
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Openbox
Architektura: x86_64

Bilard - ogólny algorytm wykrywania kolizji

Post autor: PL_kolek »

Witam!
W celach rozrywkowych (kto to słyszał, programować dla rozrywki?) postanowiłem spróbować się w napisaniu bilarda. Nie ukrywam, że najwięcej problemów sprawia mi fizyka, ale i detekcja i odpowiednie zachowanie się bil po kolizji. Tutaj akurat poruszę problem głównej i detekcji kolizji.

Zwykła detekcja, czy dwie kulki na siebie nachodzą sprawia problemy - mogą się zderzyć więcej niż dwie bile, w "stykowych" sytuacjach bardzo ważna jest kolejność kolizji, więc potrzebne jest jakiś bardziej skomplikowany system.

Wymyśliłem sobie, że powinno to wyglądać mniej więcej tak:
while(true)
{
  1. Mierzymy czas t od ostatniego przebiegu
  2. Wykrywamy wszystkie kolizje, mierzymy dla każdej czas (dt), po jakim zaszła, sortujemy kolizje od najwcześniejszej
  3. Po kolei analizujemy kolizje:
    1. Sprawdzamy ile z nich wystąpiło w tym samym czasie (dt takie samo w pewnym przybliżeniu)
    2. Obliczamy nowe prędkości dla bil w kolizji, uaktualniamy ich pozycje
    3. Usuwamy z listy kolizje, w których uczestniczyły te bile
    4. wykrywamy i dodajemy do listy wszystkie kolizje, które zaszły dla tych bil po odbiciu
  4. Gdy wszystkie kolizje zostały przerobione, wyświetlamy co trzeba i wracamy na początek
}

Czy takie coś ma szanse przejść (i fizycznie, i wydajnościowo)? Może coś w takim pomyśle zmienić?
Pirix
Piegowaty Guziec
Piegowaty Guziec
Posty: 5
Rejestracja: 23 lut 2009, 23:48
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86

Odp: Bilard - ogólny algorytm wykrywania kolizji

Post autor: Pirix »

Po punkcie d trzeba by ponownie przesortować liste kolizji, gdyż te dodane w punkcie d mogły zajść wcześniej niż inne kolizje będące już na liście.
Pozdrawiam Pirix
Awatar użytkownika
PL_kolek
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 113
Rejestracja: 30 sty 2008, 21:46
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Openbox
Architektura: x86_64

Odp: Bilard - ogólny algorytm wykrywania kolizji

Post autor: PL_kolek »

Zapomniałem dodać, że kolizje dodajemy w odpowiednie czasowo miejsce ;)
clansman5
Sędziwy Jeż
Sędziwy Jeż
Posty: 77
Rejestracja: 06 sty 2009, 10:59
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: Bilard - ogólny algorytm wykrywania kolizji

Post autor: clansman5 »

Wedlug mnie nigdy nie nastapi kolizja w tym samym czasie dwoch bil. Zawsze bedzie to delikatna roznica czasowa, takze mozna przestac iterowac po wykryciu pierwszej.
Awatar użytkownika
PL_kolek
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 113
Rejestracja: 30 sty 2008, 21:46
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Openbox
Architektura: x86_64

Odp: Bilard - ogólny algorytm wykrywania kolizji

Post autor: PL_kolek »

A np. rozbicie trójkąta idealnie w sam środek pierwszej bili równolegle do krawędzie stołu? Wówczas ta "czołowa" bila w trójkącie zachodzi idelanie tak samo na dwie kolejne bile.
xc1256

Odp: Bilard - ogólny algorytm wykrywania kolizji

Post autor: xc1256 »

clansman5 pisze:Wedlug mnie nigdy nie nastapi kolizja w tym samym czasie dwoch bil. Zawsze bedzie to delikatna roznica czasowa, takze mozna przestac iterowac po wykryciu pierwszej.
przy takim założeniu jestem ciekaw efektu gry, bo w rzeczywitości bywa tak jak kolega pisze
PL_kolek pisze:A np. rozbicie trójkąta idealnie w sam środek pierwszej bili równolegle do krawędzie stołu? Wówczas ta "czołowa" bila w trójkącie zachodzi idelanie tak samo na dwie kolejne bile.
clansman5
Sędziwy Jeż
Sędziwy Jeż
Posty: 77
Rejestracja: 06 sty 2009, 10:59
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86

Odp: Bilard - ogólny algorytm wykrywania kolizji

Post autor: clansman5 »

rozwaz to w bardzo krotkich odstepach czasu, nigdy nie nastapi zderzeni dwoch bil w idealnie tym samym czasie.
Awatar użytkownika
PL_kolek
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 113
Rejestracja: 30 sty 2008, 21:46
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Openbox
Architektura: x86_64

Odp: Bilard - ogólny algorytm wykrywania kolizji

Post autor: PL_kolek »

Postanowiłem zapytać się na stricte fizycznym amerykańskim forum, i przyniosło to odpowiedzi. Otóż to co opisał clansman5 jest tylko i aż przybliżeniem - tylko, bo komputerowo w symulacji takie zdarzenie nie jest ciężko uzyskać (pomijając oczywiście niedokładności liczb zmiennoprzecinkowych), ale aż, bo takie podejście w pełni wystarcza do symulacji gry w bilard.

Załóżmy, że trójkąt jest ułożony idealnie, jego wysokość jest równoległa do dłuższego boku stołu. Wtedy, jeżeli 1 bila trójkąta i biała mają taką samą współrzędną x, nadając białej bili tylko szybkość wzdłuż osi x, pierwsza bila trójkąta musi uderzyć w tym samym czasie dwie pozostałe bile. Z tym, że jak mi wyjaśniono, można każdą kolizję rozpatrywać oddzielnie i wyniki będą zadowalające
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 8 gości