eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming › petla kolizji -> spacjala kolizyjna
Ilość wypowiedzi w tym wątku: 6

  • 1. Data: 2011-12-08 19:00:49
    Temat: petla kolizji -> spacjala kolizyjna
    Od: " fir" <f...@W...gazeta.pl>

    (i znowu sie zle poczulem, [w zwiazku z horror nudzaca
    glupota ludzka], niewazne)

    nigdy poki co nie robilem optymalizacji detekcji kolizji,
    tylko troche sie zastanawialem ->

    najprostsza wersja detekcji kolizji jest zlozonsci
    n-kwadrat, ale defakto detekcja kolizji jest/moze byc
    zlozonosci liniowej n-do-pierwszej,
    trzeba tylko dane obiekty przestrzenne 'rejestrowac'
    w jakiejs 'spacjalnej' strukturze (nazywam tu troche
    dla zartu 'spacjalą kolizyjną', nie jest to zupelnie
    od rzeczy nazywac strukture danych o charakterze
    przestrzennym oddzielnym slowem np 'spacjala' bo to
    doprecyzowuje i pomaga)


    wezmy np wspominane kulki 2d
    [wczesniej zle napisalem ze maja srednice 5 pix, maja
    promien 5 pix a srednice 10 pix, (i kolizja nastepuje tez
    przy dist <= 10 pix],

    w tym wypadku tak naprawde nawet mozna by uzyc samego
    rambufora z obrazem okna (jesli pixel == czarny nic nie ma,
    jesli kolor to kolizja) ale jest to może trcohe brzydkie
    i pozatym nie podaje informacji o indeksie tego z czym sie
    zderzamy (czyli przyspieszenie jest polowiczne)

    nalezaloby utworzyc odzielną 'spacjalę' i pytanie brzmi
    'dokladnie jak?'

    o ile pileczka ma 10 pix srednicy a okno powiedzmy rozmiar
    500x400 (lub tez i jakis inny), dana komorka w takiej spacjali
    powinna miec rozmiar gdzies tak pewnie 30pix x 30pix (ale
    dokladnie ile?) Sa tez dwie opcje czy te komorki powinny
    przylegac ale sie nie nakladac (wtedy niezrecznie trzebaby
    czasem sprawdzac jedna komorke a czasem cztery) czy tez
    powinny sie nakladac w taki sposob by zawsze mozna sprawdzac
    tylko jedna komorke, za to przy ruchu przedmiotu trzebaby
    uzupelniec informacja kilka komorek na raz

    a moze jednak komorki powinna miec dokladnie 10x10 pix
    i nie nakladac sie, to sie wydaje moze najprostsze?

    jakies uwagi ntt?






    --
    Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/


  • 2. Data: 2011-12-08 20:31:09
    Temat: Re: petla kolizji -> spacjala kolizyjna
    Od: "Jordan Szubert" <u...@j...us.to>

    Dnia 08-12-2011 o 20:00:49 fir <f...@w...gazeta.pl> napisał(a):

    > (i znowu sie zle poczulem, [w zwiazku z horror nudzaca
    > glupota ludzka], niewazne)
    >
    > nigdy poki co nie robilem optymalizacji detekcji kolizji,
    > tylko troche sie zastanawialem ->
    >
    > najprostsza wersja detekcji kolizji jest zlozonsci
    > n-kwadrat, ale defakto detekcja kolizji jest/moze byc
    > zlozonosci liniowej n-do-pierwszej,
    > trzeba tylko dane obiekty przestrzenne 'rejestrowac'
    > w jakiejs 'spacjalnej' strukturze (nazywam tu troche
    > dla zartu 'spacjalą kolizyjną', nie jest to zupelnie
    > od rzeczy nazywac strukture danych o charakterze
    > przestrzennym oddzielnym slowem np 'spacjala' bo to
    > doprecyzowuje i pomaga)
    >
    >
    > wezmy np wspominane kulki 2d
    > [wczesniej zle napisalem ze maja srednice 5 pix, maja
    > promien 5 pix a srednice 10 pix, (i kolizja nastepuje tez
    > przy dist <= 10 pix],
    >
    > w tym wypadku tak naprawde nawet mozna by uzyc samego
    > rambufora z obrazem okna (jesli pixel == czarny nic nie ma,
    > jesli kolor to kolizja) ale jest to może trcohe brzydkie
    > i pozatym nie podaje informacji o indeksie tego z czym sie
    > zderzamy (czyli przyspieszenie jest polowiczne)
    >
    > nalezaloby utworzyc odzielną 'spacjalę' i pytanie brzmi
    > 'dokladnie jak?'
    >
    > o ile pileczka ma 10 pix srednicy a okno powiedzmy rozmiar
    > 500x400 (lub tez i jakis inny), dana komorka w takiej spacjali
    > powinna miec rozmiar gdzies tak pewnie 30pix x 30pix (ale
    > dokladnie ile?) Sa tez dwie opcje czy te komorki powinny
    > przylegac ale sie nie nakladac (wtedy niezrecznie trzebaby
    > czasem sprawdzac jedna komorke a czasem cztery) czy tez
    > powinny sie nakladac w taki sposob by zawsze mozna sprawdzac
    > tylko jedna komorke, za to przy ruchu przedmiotu trzebaby
    > uzupelniec informacja kilka komorek na raz
    >
    > a moze jednak komorki powinna miec dokladnie 10x10 pix
    > i nie nakladac sie, to sie wydaje moze najprostsze?
    >
    > jakies uwagi ntt?

    nie całkiem rozumiem Twój pomysł, ale chyba mi się nie podoba.

    mój całkiem nieoptymalny kod analityczny (100 kulek, i czasem nie wyrabia)
    wyglądał jakoś tak:
    //szkic w notacji C#
    delegate void Cont();
    Pair<float,Cont>? findCollision(Ball a,Ball b);
    //jeśli kulki się nie zderzają, to null,
    //zwraca parę -- moment tego zderzenia, i procedurę modyfikująca stan
    biorących udział w zderzeniu kulek, jeśli to zderzenie zajdzie
    //jeśli mamy kulki a,b i c, to findCollision wołamy dla (a,b), (a,c) i
    (b,c), możemy dostać od 0 do 3 procedur, ale wykonujemy najwyżej jedną --
    dla pierwszego zderzenia,
    //albowiem potem kulki lecą inna trasa, i pozostałe zderzenia są nieważne
    (bo zakładają, że kulki lecą po niezmodyfikowanej trasie)
    Pair<float,Cont>? zapCol=null;//najblizsza kolizja do wykonania,

    w funkcji Update robilem cos takiego

    T=now();
    while(zapCol==null || zapCol.t<=T){
    if(zapCol!=null){
    zapCol.proc();
    }
    zapCol=null;//
    Pair<float,Cont>? f=null;//właśnie znaleziona kolizja
    for(int i=0;i<balls.length;i++){
    f=null;
    b=balls[i];
    //tu byly testy kolizji ze scianami, pomijam dla czytelnosci
    for(int j=0;j<i;j++){
    a=balls[j];
    f=findCollision(a,b);
    if(zapCol==null || (f!=null && f.t<zapCol.t)){//jeśli znaleziona
    kolizja jest bliższa w czasie niż zapamiętana
    zapCol=f;//to będzie użyta
    }
    }
    }
    }

    ale to robi O(n^2) dla każdej kolizji, można by znalezione kolizje (f)
    zapamiętywać gdzieś, i invalidować tylko te, w których uczestniczyły kulki
    dla wykonywanej (proc()) kolizji.

    kod iteracyjny też się się da optymalizować, i ktoś się tym pewnie
    zajmował, ale ja wolałem się pobawić analitycznym



    --
    Jordan Szubert


  • 3. Data: 2011-12-08 21:05:57
    Temat: Re: petla kolizji -> spacjala kolizyjna
    Od: " M.M." <m...@N...gazeta.pl>

    fir <f...@W...gazeta.pl> napisał(a):

    > (i znowu sie zle poczulem, [w zwiazku z horror nudzaca
    > glupota ludzka], niewazne)
    >
    > nigdy poki co nie robilem optymalizacji detekcji kolizji,
    > tylko troche sie zastanawialem ->
    >
    > najprostsza wersja detekcji kolizji jest zlozonsci
    > n-kwadrat, ale defakto detekcja kolizji jest/moze byc
    > zlozonosci liniowej n-do-pierwszej,
    > trzeba tylko dane obiekty przestrzenne 'rejestrowac'
    > w jakiejs 'spacjalnej' strukturze

    Przychodza mi do glowy dwa rozwiazania:
    1) Jakas specjalna implementacja KD-Tree, tak aby uaktualnianie
    obiektow dodanych wczesniej do KD-Tree mialo niski koszt.
    2) Podzielic ekran na N kresek pionowych i M kresek poziomych.
    Wyliczyc wsplrzedne skrzyzowan kresek. W kazdym przecieciu
    wstawic liste. Potem kulke dodawac do listy w najblizszym
    skrzyzowaniu. No i aby szukac kolizji, wystarczy przeszukac
    kulki z kilku pobliskich skrzyzowan-list. Dodawanie do listy
    to koszt O(1), usuwanie O(1), przegladanie kilku pobliskich
    list to srednio... moze 2^D * X / N / M, gdzie X to ilosc kulek,
    a D to ilosc wymiarow. Czyli dla 1000 kulek w 2D i podziale
    ekranu na 100 kratek, mamy zlozonosc jednej "klatki fizyki"
    1000 * 4 * 1000 / 100 = 40tys. Znacznie mniej niz X^2=1mln.
    Pozdrawiam







    --
    Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/


  • 4. Data: 2011-12-08 21:27:00
    Temat: Re: petla kolizji -> spacjala kolizyjna
    Od: " " <f...@N...gazeta.pl>

    > > jakies uwagi ntt?
    >
    > nie ca=B3kiem rozumiem Tw=F3j pomys=B3, ale chyba mi si=EA nie podoba.
    >
    > m=F3j ca=B3kiem nieoptymalny kod analityczny (100 kulek, i czasem nie wy=
    > rabia) =
    >
    > wygl=B1da=B3 jako=B6 tak:
    > //szkic w notacji C#
    > delegate void Cont();
    > Pair<float,Cont>? findCollision(Ball a,Ball b);
    > //je=B6li kulki si=EA nie zderzaj=B1, to null,
    > //zwraca par=EA -- moment tego zderzenia, i procedur=EA modyfikuj=B1ca s=
    > tan =
    >
    > bior=B1cych udzia=B3 w zderzeniu kulek, je=B6li to zderzenie zajdzie
    > //je=B6li mamy kulki a,b i c, to findCollision wo=B3amy dla (a,b), (a,c)=
    > i =
    >
    > (b,c), mo=BFemy dosta=E6 od 0 do 3 procedur, ale wykonujemy najwy=BFej j=
    > edn=B1 -- =
    >
    > dla pierwszego zderzenia,
    > //albowiem potem kulki lec=B1 inna trasa, i pozosta=B3e zderzenia s=B1 n=
    > iewa=BFne =
    >
    > (bo zak=B3adaj=B1, =BFe kulki lec=B1 po niezmodyfikowanej trasie)
    > Pair<float,Cont>? zapCol=3Dnull;//najblizsza kolizja do wykonania,
    >
    > w funkcji Update robilem cos takiego
    >
    > T=3Dnow();
    > while(zapCol=3D=3Dnull || zapCol.t<=3DT){
    > if(zapCol!=3Dnull){
    > zapCol.proc();
    > }
    > zapCol=3Dnull;//
    > Pair<float,Cont>? f=3Dnull;//w=B3a=B6nie znaleziona kolizja
    > for(int i=3D0;i<balls.length;i++){
    > f=3Dnull;
    > b=3Dballs[i];
    > //tu byly testy kolizji ze scianami, pomijam dla czytelnosci
    > for(int j=3D0;j<i;j++){
    > a=3Dballs[j];
    > f=3DfindCollision(a,b);
    > if(zapCol=3D=3Dnull || (f!=3Dnull && f.t<zapCol.t)){//
    je=B6li znalezi=
    > ona =
    >
    > kolizja jest bli=BFsza w czasie ni=BF zapami=EAtana
    > zapCol=3Df;//to b=EAdzie u=BFyta
    > }
    > }
    > }
    > }
    >
    > ale to robi O(n^2) dla ka=BFdej kolizji, mo=BFna by znalezione kolizje (=
    > f) =
    >
    > zapami=EAtywa=E6 gdzie=B6, i invalidowa=E6 tylko te, w kt=F3rych uczestn=
    > iczy=B3y kulki =
    >
    > dla wykonywanej (proc()) kolizji.
    >
    > kod iteracyjny te=BF si=EA si=EA da optymalizowa=E6, i kto=B6 si=EA tym =
    > pewnie =
    >
    > zajmowa=B3, ale ja wola=B3em si=EA pobawi=E6 analitycznym
    >

    moim zdaniem to co powyzej jest bardzo dziwne
    bo nie trzeba sie tak wcale babrac z czasami itp

    ja poki co uzywam tutaj

    http://dl.dropbox.com/u/42887985/kulki2d.zip

    tylko trywialnej 'kwadratowej' detekcji kolizji
    (i to grubo bo kulek jest 200 ramek okolo 100/s
    i fizyka jest 5x na ramke - czyli to leci 100tys
    detekcji kolizji na sekunde)

    klawisze: 't' wlacza tlumienie, spacja przelacza
    grawitacje, 'z' wlacza pokazywanie wektorow predkosci
    (ale nie jest to dokonczony programik (bo zrobilbym
    wystrzeliwanie kulek mysza itd) tylko fragment do testu)

    kolizji zreszta nie chce mi sie poprawiac (200 kulek starczy)
    wolalbym dopracowac ta fizyke (bo jestem jej jakos niepewny/
    niezadowolony) przed zaciemnieniem wszystkiego
    optymalizacja kolizji


    --
    Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/


  • 5. Data: 2011-12-08 21:46:01
    Temat: Re: petla kolizji -> spacjala kolizyjna
    Od: " " <f...@N...gazeta.pl>

    M.M. <m...@N...gazeta.pl> napisał(a):

    > fir <f...@W...gazeta.pl> napisał(a):
    >
    > > (i znowu sie zle poczulem, [w zwiazku z horror nudzaca
    > > glupota ludzka], niewazne)
    > >
    > > nigdy poki co nie robilem optymalizacji detekcji kolizji,
    > > tylko troche sie zastanawialem ->
    > >
    > > najprostsza wersja detekcji kolizji jest zlozonsci
    > > n-kwadrat, ale defakto detekcja kolizji jest/moze byc
    > > zlozonosci liniowej n-do-pierwszej,
    > > trzeba tylko dane obiekty przestrzenne 'rejestrowac'
    > > w jakiejs 'spacjalnej' strukturze
    >
    > Przychodza mi do glowy dwa rozwiazania:
    > 1) Jakas specjalna implementacja KD-Tree, tak aby uaktualnianie
    > obiektow dodanych wczesniej do KD-Tree mialo niski koszt.
    > 2) Podzielic ekran na N kresek pionowych i M kresek poziomych.
    > Wyliczyc wsplrzedne skrzyzowan kresek. W kazdym przecieciu
    > wstawic liste. Potem kulke dodawac do listy w najblizszym
    > skrzyzowaniu. No i aby szukac kolizji, wystarczy przeszukac
    > kulki z kilku pobliskich skrzyzowan-list. Dodawanie do listy
    > to koszt O(1), usuwanie O(1), przegladanie kilku pobliskich
    > list to srednio... moze 2^D * X / N / M, gdzie X to ilosc kulek,
    > a D to ilosc wymiarow. Czyli dla 1000 kulek w 2D i podziale
    > ekranu na 100 kratek, mamy zlozonosc jednej "klatki fizyki"
    > 1000 * 4 * 1000 / 100 = 40tys. Znacznie mniej niz X^2=1mln.
    > Pozdrawiam
    >
    >
    no pisalem wlasnie o tym - pytanie tylko o najbardziej korzystna
    postac tej 'spacjali' dokladnie

    chwilowo najprostsza wydaje mi sie chyba wersja z komorkami
    10x10 pixeli, wtedy w takiej komorce moze byc najwiecej 4 kulki

    kazda kulke przy ruchu wpisywaloby sie do najwiecej 4rech
    komorek, podobnie czytaloby sie okolo 4ry komorki, mozna
    zrobic na tablicy np

    int spacjalaKolizyjna[40][50][4];

    raczej proste i raczej szybkie, dzieki temu ze przypadek prosty










    --
    Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/


  • 6. Data: 2011-12-08 21:57:19
    Temat: Re: petla kolizji -> spacjala kolizyjna
    Od: " " <f...@N...gazeta.pl>

    >
    > tylko trywialnej 'kwadratowej' detekcji kolizji
    > (i to grubo bo kulek jest 200 ramek okolo 100/s
    > i fizyka jest 5x na ramke - czyli to leci 100tys
    > detekcji kolizji na sekunde)
    >
    100 tys petli - bo czastkowych sprawdzen kolizji to
    wychodziloby 20 mln/sekunde

    --
    Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/

strony : [ 1 ]


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: