View previous topic :: View next topic |
Author |
Message |
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Sun Nov 05, 2006 9:52 pm Post subject: Tuvaakais celsh starp diviem lenkjiem |
|
Vecum vecaa probleema ar diviem lenkjiem un iisaakaa celja atrashanu starp tiem. Atceros,ka kautkad paaris gadus atpakalj es to atrisinaaju diezgan vienkaarshi,bet tagad ziimeejot uz lapaam nesanaak iisti smuki.Sanaak baigi daudz if'u.Meegjinaaju googleet,bet neko iisti neatradu.
Taatad:vajadziiga kaada funkcija,kas vareetu noteikt pa kuru pusi buutu iisaak roteet no kaada lenkja,lai sasniegtu otru lenkji.Labs piemeers buutu kamera,kas seko automobilim.Ja automobilis sagriezhas ljoti aatri,tad kamera nerotees tam pakalj pa garaako celju,bet gan pa iisaako.Visi lenkji ir robezhaas [0;360). _________________ long time; /* know C */ |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Sun Nov 05, 2006 10:08 pm Post subject: |
|
Ko nozīmē "ceļš" tavā jautājumā? Vai tik tu nedomāji uz kuru pusi griezties? Vai tik tu neesi problēmu par daudz noreducējis.. Tev nav dotas divas pozīcijas - vektori A un B, un skata vektors C? Un tad, esot punktā B un skatoties virzienā C, tev jāpagriežās, lai skatītos virzienā no punkta B uz punktu A? Tb jāmaina tas C vektors.
Ja tā, tad es to risinu (Skvēros spēlētāja skatienu vēršu uz bumbu) ar vektoru skalāro reizinājumu: x = C . (A-B);
Ja x > 0, tad jāgriežas uz vienu pusi, ja x < 0, tad jāgriežas uz otru pusi. Ja x=0, tad vai nu tu jau skaties uz A punktu, vai arī skaties uz gluži otru pusi (tad griezties ir vienalga uz kuru pusi). To vai skatās uz otru pusi var apēķināt ar vektoriālā reizinājuma palīdzību, tik tur jāzin kādās dimensijās tev tas notiek. Bet vispārīgi runājot - jāpaņem vektoriālā reizinājuma vienas komponentes zīme, unt ad <0 skatās uz A, >0 skatās prom no A.
Tā apmēram.
Edit:
nu ja doti tiešām leņķi, tad jau var to pārveidot uz šo vektoru risinājumu: B=(0,0) A=(cos(alfa), sin(alfa)), C=(cos(beta), sin(beta)). Un reku ir tavi divi leņķi - alfa un beta. |
|
Back to top |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Sun Nov 05, 2006 10:15 pm Post subject: |
|
Nee nee probleema irdaudz vienkaarshaaka.Ok,es nedaudz nesaprotami uzrakstiju.
Ir doti divi lenkji-A un B.Lenkjis B ir jaasamazina/jaapalielina tik ilgi kameer B=A.Man ir jaadabuu tas,vai lenkjis ir jaasamazina vai jaapalielina(t.i. uz kuru pusi roteet)-jaadabuu iisaakais celsh.Bet sanaak kaudze ar if'iem,kameer vis straadaa vienkaarshi nepareizi. _________________ long time; /* know C */ |
|
Back to top |
|
|
GiGa Indago Uzvarētājs
Joined: 25 Sep 2003 Posts: 887
|
Posted: Sun Nov 05, 2006 10:31 pm Post subject: |
|
Pag, es neesmu sapratis problēmu vai arī bubu risinājumu?
a.b = |a|*|b|*cos(alpha) ;
dot > 0 ja leņķis starp vektoriem < pi/2 , un dot < 0 ja leņķis > pi/2. Absolūto virzienu, kurā griezties, tā nenoteikt...
ja runa iet par leņķiem, tad varbūt:
Code: |
if( A > B ) {
if( A - B < 180 ) {
//++B;
} else {
//--B;
}
} else if( A < B ) {
if( B - A < 180 ) {
//--B;
} else {
//++B;
}
}
|
šitam laikam būtu jāstrādā, vismaz pretpiemēru uzreiz nemāku atrast... |
|
Back to top |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Sun Nov 05, 2006 10:34 pm Post subject: |
|
Nu ok.Palikshu pie risinaajuma ar 4 if'iem(tieshi tik pat bija manaa versijaa,vieniigi maneejais kautkaa negribeeja straadaat pareizi-man noteikti bija kluuda ziimees).Ok tuuliit izmeegjinaashu sho variantu.
[EDIT]Paldiesinj,viss straadaataa,vieniigi koods sanaak baigi garsh[/EDIT] _________________ long time; /* know C */ |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Sun Nov 05, 2006 11:04 pm Post subject: |
|
Nu manā stāstītajā jau arī to pašu var izdarīt (laikam par biežu neskaidri izsakos ;):
Code: | float x = cos(A)*sin(B) - cos(B)*sin(A);
if (x > 0.0f)
{
//--B
}
else
{
// ++B
} |
To x izrēķināšanu var nedaudz nooptimizēt, ja lieto trigonometrijas formulas:
Code: | float x = sin(B-A) - sin(A-B); |
Edit: ahā, pārlasīju sevis teikto iepriekš un sapratu, ka sajaucu vietām skalāro ar vektoriālo reizinājumu. Šitāda nūbiska kļūda :)
x = a.x*b.y - b.x*a.y ir tak vektoriālā reizinājuma trešā komponente! |
|
Back to top |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Mon Nov 06, 2006 12:47 am Post subject: |
|
Ou ou ou.Veciit es pat neaizdomaajos,ko to vareetu ar siinusu un csinusu izreekjinaat.Shobriid nav laika iedziljinaaties,bet izskataas logjiski un galvenais-straadaa!Bet ko es ieguustu rezultaataa (t.i. kas ir x).
Es katraa freimaa atnjemu vai pieskaitu skaitli attieciibaa pret FPS.Taapeec kad rezultaats nonaak tuvu nullei-piemeeram,taa pati autamashiinu kamera saaktu raustiities.Kaa es vareetu uszinaat no taa rezultaata (x),ka liidz beigaam ir palicis mazaak,kaa es grasos atnjemt-liidz ar to A=B? _________________ long time; /* know C */ |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Mon Nov 06, 2006 1:25 am Post subject: |
|
x pēc būtības ir vektora garums, kuš veidojās no A un B vektoru skalārā reizinājuma. x tuvosies 0, kad B tuvosies A, un x=0, kad A=B.
Pie B skaiti klāt -x pareizinātu ar kautkādu koeficientu. To koeficientu piedzen klāt uz aci, tā lai tā kustība notiek tik ātri, cik tu gribētu. Tb jo lielāks koeficients, jo ātrāk kustēsies. Un jo mazāks, jo lēnāk kustēsies.
Vēl viena lieta - ja B pārsviedīsies A otrā pusē, tad x mainīs zīmi. |
|
Back to top |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Mon Nov 06, 2006 1:31 am Post subject: |
|
Es te meegjinaaju logjiski izspriest.Vai tad nesanaak,ka ar arcsinusu ieguustu atpakalj lenkji (no x),kas ir abu lenkju starpiiba?Tad es vareetu vienkaarshi sho starpiibu saliidzinaat ar atnjemamo skaitli.Ja tas ir mazaaks,tad A=B. _________________ long time; /* know C */ |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Mon Nov 06, 2006 1:59 am Post subject: |
|
Nē, ar arcsinusu tu nekā neiegūsi, jo tur ir divu sīnusu starpība.
Bet, emm.. ja jau tev vajag leņķu starpībi, tad kāpēc to tad tā arī neņem B-A, jo tev taču leņķu vērtības ir zināmas! Ja starpība iznāk >180, tad to vajag atņemt no 360, tb ņemt 360-(B-A). |
|
Back to top |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Mon Nov 06, 2006 2:03 am Post subject: |
|
Laikam taapeec,ka es esmu nedaudz tizls.Biju jau aizdomaajies tik taalu,ka vienkaarsho "burkaanu atnjemshanas" metodi neiedomaajos.
Par to arcsinusu.Mees atnjemam divu lenkju starpiibu siinusus.Abi atrodas rinkjii uz Y ass.Taatad to starpiiba arii ir uz Y ass.Tatad ar siinusu kautkas ir saistiits.Ko tad ieguusim ar arcsinusu? Itkaa shis jautaajums vairs nav svariigs,bet tomeer-kautko ieguustam. _________________ long time; /* know C */ |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Mon Nov 06, 2006 2:37 am Post subject: |
|
Ļoti "dīvains" tavs spriedums. Tam tak ar asīm nav nekāda sakara - tb tie nav nekādi vektori tak!
Taču izrādās vēl to x var izteikt šitā (ņemot palīgā divu sinusu stapības formulu):
Code: | float x = sin(b-a); |
Vajag tik trigonometrijas formuliņās vairāk paskatīties.. :)
Tā ka paņemot arcsin(x) dabūsi gan savu leņķu starpību. |
|
Back to top |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Mon Nov 06, 2006 2:19 pm Post subject: |
|
Nee nav diivains.Iedomaajies siinusa un kosinusa rinkji.Siinusa veertiibas sanaak uz y ass,bet kosinusa veertiibas uz x ass.Taatad siinusu starpiibai bija jaasanaak tai lenkju starpiibai un ar arcsinusu vinju var dabuut atpakalj.Un paldies par sin(b-a)-neiedomaajos apskatiities formulinjas trigonometrijas graamataa. _________________ long time; /* know C */ |
|
Back to top |
|
|
GiGa Indago Uzvarētājs
Joined: 25 Sep 2003 Posts: 887
|
Posted: Mon Nov 06, 2006 9:27 pm Post subject: |
|
Quote: | Iedomaajies siinusa un kosinusa rinkji.Siinusa veertiibas sanaak uz y ass,bet kosinusa veertiibas uz x ass.Taatad siinusu starpiibai bija jaasanaak tai lenkju starpiibai un ar arcsinusu vinju var dabuut atpakalj. |
Ar to tu domā, ka: a - b = arcsin( sin(a) - sin(b) ) ? Nebūs vis... |
|
Back to top |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Mon Nov 06, 2006 9:47 pm Post subject: |
|
GiGa wrote: |
Ar to tu domā, ka: a - b = arcsin( sin(a) - sin(b) ) ? Nebūs vis... |
Nee taa es nedomaaju.Es domaaju a-b=arcsin(sin(a-b)).
[EDIT]Shis posts izskatiijaas peec treshaas klases uzdevuma-pie trijiem burkaaniem pieskaita vienu un tad atnjem vienu,sanaak triis burkaani.[/EDIT] _________________ long time; /* know C */ |
|
Back to top |
|
|
|