-
11. Data: 2011-12-09 20:35:02
Temat: Re: ? vs ?
Od: " " <f...@W...gazeta.pl>
bartekltg <b...@g...com> napisał(a):
> W dniu 2011-12-09 20:34, SĹawomir Szczyrba pisze:
> > Quidquid MsgId est, timeo profesor fire et dona ferentem...
> >
> >> 1) MATEMATYKA /metoda statyczna
> >> albo dac duze kroki-skoki pozycji kulek w kazdej
> >> iteracji i wyznaczac dokladnie punkty kolizji z
> >> matematyki (i probowalem tak robic bo nie jest to az
> >> tak trudne by sie nie dalo przynajmniej zaczac -
> >> trzeba przepisac na kod rownanie "dist(x,y,nx,ny) == 2*R"
> >> (jest to rownanie kwadratowe liczy sie pierwiastki)
> >>
> > Moment.
> > Twierdzisz, Ĺźe â(a²+b²) jest rĂłwnaniem kwadratowym?
>
> Takim zakamuflowanym...
>
> > W ktĂłrym miejscu, przepraszam...
>
> ( Dist(x,y) )^2 = 4R^2
> juĹź jest w peĹni.
>
tu chodzi o wzor na dist(x1,y1,x2,y2):
sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1))
dokladniej to chodzi o przyrownanie do 2*R odleglosci miedzy
poruszajaca sie kulka (ja rozwiazywalem wzgledem parametru t
gdzie t jest miedzy 0 a 1)
dist(x+t*vx, y+t*vy , ox, oy) = 2*R
jest to rownanie kwadratowe wzgledem t,
dokl. kawalek kodu na brudno z krtorym probowalem:
float px = prev_ball_x ; //poruszajaca sie kulka
float py = prev_ball_y ;
float vx = ball[i].vx ; // jej predkosc
float vy = ball[i].vy ;
float ox = ball[jn].x ; // kulka kolizyjna
float oy = ball[jn].y ;
float R = 10.0;
// px+t*vx-ox;
// py+t*vy-oy;
// (px-ox)*(px-ox)+t*2.0*vx*(px-ox)+t*t*vx*vx+
// (py-oy)*(py-oy)+t*2.0*vy*(py-oy)+t*t*vy*vy-R*R=0;
float a = vx*vx+vy*vy;
float b = 2.0*vx*(px-ox)+2.0*vy*(py-oy);
float c = (px-ox)*(px-ox)+(py-oy)*(py-oy)-R*R;
// c*=-1;
float delta = b*b-4.0*a*c;
float t1=-1;
float t2=-1;
if(delta>=0)
{
t1= (-b+sqrt(delta))/(2*a);
t2= (-b-sqrt(delta))/(2*a);
}
t2 jest zdaje sie zawsze blizszym przecieciem, t1 mozna wogole
nie liczyc; (jak mowie to zdaje sie ze dzialalo (wygladalo ze dziala)
ale natrafilem na dalsze komplikacje w zwiazku z tym ze trzebato by puszczac
rekurencyjnie dla wielokrotnych odbic, a poniewaz trzebabylo
ciagac pare paramatrow nie chcialo mi sie z tym babrac i
przeszedlem na 'metode iteracyjna' po tej wczesnej probie (kod na
brudno po prostu przepisany wzorek z kartki dlugopisem))
--
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
-
12. Data: 2011-12-09 22:54:48
Temat: Re: ? vs ?
Od: bartekltg <b...@g...com>
W dniu 2011-12-09 21:35, f...@W...gazeta.pl pisze:
> tu chodzi o wzor na dist(x1,y1,x2,y2):
> sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1))
>
> dokladniej to chodzi o przyrownanie do 2*R odleglosci miedzy
> poruszajaca sie kulka (ja rozwiazywalem wzgledem parametru t
> gdzie t jest miedzy 0 a 1)
>
> dist(x+t*vx, y+t*vy , ox, oy) = 2*R
>
> jest to rownanie kwadratowe wzgledem t,
Nie, jak zauważył Sławomir -formalnie nie jest. Ale staje się
nim po podniesieniu obu stron do kwadratu, stąd stwierdzenie,
że w sumie to takie 'zakamuflowane rownanie kwadratowe'.
Co więcej, Można to zrobić jeszcze sprytniej. Kolizję
wyliczać za pomocą _liniowego_ zagadnienie najmniejszyhc kwadratów.
t*[vx;vy] = [ox;oy] - [x;y].
Z LZNK dostajemy czas maksymalnego zbliżenia t0,
obliczamy dystans D dla tego zbliżenia. Jeśli
d>r+R, to nie mamy zderzenia, w przeciwnym wypadku
pitagorasem obliczamy poprawkę:
(?t*V)^2 + D^2 = (R+r)^2
?t = 1/V sqrt((R+r)^2 - D^2)
V to moduł prędkośći,
interesuje nas oczywiscie moment t0-?t.
Upraszcza to obliczenia, pozwala uniknać sprawdzania znaku
delty etc. Samo policzenie t sprowadza się właściwie do rzutu
(i to niezależnie od wymiaru przestrzeni, w R^3 będzie to samo).
pzdr
bartekltg