[ StefanJer91 @ 22.01.2008. 20:33 ] @
Aj prvo da kazem za sta mi ovo treba:

Ja se bavim programiranjem, tj programiranjem igara za cije je pravljenje potrebno dosta matematike tj. logike uopste. Igra na kojoj radim je sidescroller (gleda se sa strane kao u super mariju), stim sto je dosta naprednije. Posto sam uspeo da uradim fiziku za igru i detekciju kolizije za razlicita geom. tela, bilo mi je potrebno da odradim lasere kojih ce biti u igri. Kako bi igra brze radila (bila optimizovanija), cela mapa u igri je podeljena na celije. Sve celije ustvari predstavljaju matrix. Celija sadrzi informaciju o tome kakva se tela nalaze u njoj (to su staticka i dinamicka). Laser se moze reprezentovati kao poluprava mada ga ja definisem sa 2 vektora. 1 vektor predstavlja njegovu poziciju, dok je drugi tu samo da bi odredio smer (dakle on moze biti jedinicni). Uspeo sam da napravi da lako pronadjem celije kroz koje zrak prolazi, za ovaj trenuto problem nije ni bitno kako. E sada za svaku celiju u kojoj je laser moze biti neki staticni objekat kroz koji laser ne bi trebalo da prodje. Jedan od staticnih objekata u igri je i krug. Ja sam dosta lupao glavu, ali nisam uspeo da pronajdem resenje kako bih ovo uradio sa vektorima, tako da mi je na kraju jedino preostala linearna f-ja i slucaj kada je laser paralelan sa y osom (dakle prava linija ali nije linearna f-ja ). Dakle ono sto mi je potrebno su tacke u kojima se prava i krug seku u slucaju da ih ima.

Evo kako sam to uradio preko linerne f-je:
laser predstavim kao lineranu f-ju tj. y = k*x+n
i imamo ovu jednacinu x^2+y^2 = R^2
Recicemo da je kordinatni pocetak u centru kruga. Dakle R nam je poznato i k i n nam je poznato, ostaje nam da nadjemo x i y:

x^2 + (k*x + n)^2 = R^2

x^2 + k^2*x^2 + 2*k*n*x + n^2 - R^2 = 0

Ovo je ustvari kvadratna jednacina:

(1 + k^2)*x^2 + 2*k*n*x + (n^2 - R^2) = 0

Radi bolje citljivosti bice da je:
A = 1 + k^2
B = 2*k*n
C = n^2 - R^2

determinanta je:
D = B^2 - 4*A*C

Dalje i sami znate kako da dobijete x i y... Ako je D = 0 znaci da prava tangira krug, ako je D > 0 znaci da ga sece pa imamo 2 resenja, a ako je D < 0 znaci da se krug i prava ne seku. Dakle moje pitanje je dal postoji nacin da se ovo odradi vektorski? Od informacija posedujete pocetnu tacku lasera, njegov smer (moze biti to drugi vektor, ugao nije ni bitno..) i naravno poziciju centra i poluprecnik kruga. Izvinjavam se za ovoliki tekst, koji ni nije bio potreban, al jbg kad sam se vec raspisao :)
[ miki069 @ 24.01.2008. 20:18 ] @
U slucaju kad prava tangira krug ugao cije je teme dodirna tacka a kraci (dodirna tacka - polazna tacka) i (dodirna tacka - centar kruga) je ugao od 90 stepeni. Mozes lako da odredis ugao pod kojim se iz pocetne tacke lasera vidi krug. Za sve manje uglove od tog ugla ga sece, za taj ugao ga tangira, a za sve vece ga masi. Ako sam te dobro razumeo ti mozes kao informaciju da imas ugao cije je teme polazna tacka lasera a kraci (laser-centar kruga) i ( poluprava - putanja lasera). Ako nije jasno drugi put ide slika i formula za ugao pod kojim se iz date tacke vidi dati krug. Ne bi bilo lose da ti okacis sliku i naznacis sta imas a sta trazis, mada mislim da sam te dobro razumeo.
[ StefanJer91 @ 24.01.2008. 21:08 ] @
Da dobro si razumeo, samo su mi potrebne tacke preseka ako ih ima. Ovo sto si ti rekao je provera da li prava sece ili nesece krug, a ne daje informaciju o tackama. Dakle u prethodnom postu sam objasnio kao sam to uradio sa sistemom jednacina od 1 kvadratne i 1 linearne f-je, a mene zanima da li to moze da se uradi vektorski.
[ miki069 @ 24.01.2008. 22:14 ] @
1. "Vektorski" imas koordinate tacke T(X0, Y0) iz koje krece laser i idealno bi bilo da imas ugao alfa izmedju poluprave lasera i pozitivnog smera x-ose.
2. Moras da predjes u "skalarni" oblik ali je tebi sad nepoznata jednacina linerane funkcije kojom ide laser: y=k*x+n, to jest nepoznati su ti koeficijenti k i n.

3. k=tangens(alfa)
4. n pronalazis iz pripadanja tacke T(X0,Y0) putanji lasera: y=k*x+n odakle sledi da je Y0=k*X0 + n odnosno n=Y0 - k*X0
4. Posle njihovog nalazenja funkcionise ono sto si izlozio u tvom prvom postu.