View previous topic :: View next topic |
Author |
Message |
Vecis
Joined: 01 Jan 2007 Posts: 144
|
Posted: Thu Jun 10, 2010 11:28 pm Post subject: Dots nogrieznis vajag iegūt tā leņķi |
|
Zināmi ir punkti A(X,Y) un B(X2,Y2)
Vai var aprēķināt leņķi alfa? (attēlā, punktiem A un B var būt jebkādas koordinātas)
Ja var tad kā?
Zaļā līnija bildē vienkārši novilkta tur kur 0 grādi. |
|
Back to top |
|
|
DeRatizators
Joined: 27 Apr 2006 Posts: 492
|
Posted: Thu Jun 10, 2010 11:35 pm Post subject: |
|
Pff, kārtējais triviālais trigonometrijas uzdevums.
Varbūt kļūs vieglāk, ja zalās līnijas galā ieliksi punktu C ... C koordinātes ir gandrīz tās pašas kā punktam B, tik jāpieskaita n pie X vai Y komponentes atkarībā no tā, pret kuru asi mēri to leņķi.
Bet vispār drošāk risināt ar vektoriem, tad nevarēs ieberzties pēc tam ar leņķa virzienu Teiksim, tas melnais ir BA vektors un zaļais būs BC ( BC paralēls tavu koordināšu sistēmas X vai Y asij). _________________ Any PANCAKE has to be long and thin and short and fat. Not to mention being an excellent insulator and a superb conductor. |
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Thu Jun 10, 2010 11:50 pm Post subject: |
|
C++ā tas būtu atan2( Y-Y2, X-X2 )
..ja vajag īsāko leņķi starp šo vektoru un 0-grādu leņķa vektoru, tad acos( dot( normalize(A), normalize(B) ) ) _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Thu Jun 10, 2010 11:54 pm Post subject: |
|
Cik noprotu, tu C# kodē.
Tad kods būs sekojošs.
Code: | leņķis = Math.Atan2(y2-y, x2-x); |
Tikai ņem vērā, ka rezultāts būs radianos, nevis grādos. Lai pārveidotu no radianiem uz grādiem, nāksies vērtību sareizināt ar 180 un izdalīt ar Math.PI.
Code: | gradi = radiani * 180 / Math.PI; |
_________________ long time; /* know C */ |
|
Back to top |
|
|
Vecis
Joined: 01 Jan 2007 Posts: 144
|
Posted: Fri Jun 11, 2010 12:02 am Post subject: |
|
Nav C# bet tikko to pašu uzraku Python'ā, par radiānu un grādu pārveidošanu jau zinu.
Paldies
Code: |
import math
alpha=math.atan2(y2-y,x2-x)*180/math.pi
|
|
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Fri Jun 11, 2010 8:51 am Post subject: |
|
Vai tad nav no x un y jāatņem x2 un y2, nevis otrādi? Vektoru jau aprēķina atņemot no beigu punkta sākuma punkta koordinātes. Tavā, un elvman, gadījumā tu aprēķināsi to leņķi, kas rodas, ja no punkta A novelk X asi un ņem to šaurāko leņķi pret vektoru AB. Tas būs tas pats kas 180 mīnuss tavs prasītais leņķis.
Bet vispār paklausies ko DeRatizators saka. Iespējams tev nemaz leņķi nevajag. Tā vietā vieglāk (un performancīgāk) būs operēt ar vektoriem. |
|
Back to top |
|
|
elvman Indago Uzvarētājs
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Fri Jun 11, 2010 10:01 am Post subject: |
|
Ui, sorry. Es nepaskatījos, ka sākumpunkts ir X2, Y2. Parasti mēdz apzīmēt otrādi. _________________ long time; /* know C */ |
|
Back to top |
|
|
Vecis
Joined: 01 Jan 2007 Posts: 144
|
Posted: Fri Jun 11, 2010 2:17 pm Post subject: |
|
Kodā ir otrādi, tas tāds sīkums attēlā ko sajaucu.
Nezinu vai ar vektoriem ies cauri kā domāts:
Punktos A un B ir bumbiņas, kurām sadursmē izrēķinu šo leņķi un bumbiņa pret kuru sadurās tiek pakustināta vienu vienību pa to pašu leņķi.
Code: |
img.point((x,y), outline=(200,70,70), width=41)
img.point((x2,y2), outline=(255,0,123), width=41)
dist=math.sqrt((x2-x)*(x2-x)+(y2-y)*(y2-y))
if dist<=41:
a=math.atan2(y2-y,x2-x)*180/math.pi
x2+=degx(a)
y2+=degy(a) #pēdējās 2 funkcijas rēķina sinusu un kosinusu lai pārvietotos vajadzīgajā virzienā
|
|
|
Back to top |
|
|
snake5 Indago dalībnieks
Joined: 27 Jun 2007 Posts: 2590
|
Posted: Fri Jun 11, 2010 2:22 pm Post subject: |
|
Ož tiešām pēc nepieciešamības strādāt ar vektoriem.
Ja par vienu vienību kustība notiek, tad vienkārši jānormalizē vektors (jādala ar garumu) un tad jāpieskaita bumbas pozīcijai. _________________ "There are two choices here: "looks good" and "realism"." -- Paul Nettle |
|
Back to top |
|
|
Vecis
Joined: 01 Jan 2007 Posts: 144
|
Posted: Fri Jun 11, 2010 3:11 pm Post subject: |
|
Nu ja tā var gūt labāku performance (pagaidām tas viss notiek uz 369mhz procesora, ātrāk=labāk) tad domāju nav problēmu to pārrakstīt ar vektoriem, paldies! |
|
Back to top |
|
|
bubu Indago Uzvarētājs
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Fri Jun 11, 2010 3:44 pm Post subject: |
|
Tev vajag pabīdīt bumbiņas prom vienu no otras pa līniju, kas iet caur to asīm tā lai bumbiņas nesaduras? Tad tas ir ļoti vienkārši. Pieņemsim vektorus vA un vB par bumbiņu centru koordinātēm.
Code: | delta = vB - vA
dist = |delta|
if (dist < MINIMUM_DISTANCE)
{
delta /= 2 * dist
vA -= delta
vB += delta
} |
vB - vA ir vektoru atņemšana (pa komponentēm)
|delta| ir vektora garuma rēķināšana - sqrt(x*x+y*y)
delta / ... ir vektora izdalīšana ar skalāru lielumu (pa komponentēm)
vA -= ... un vB += ... ir vektoru saskaitīšana/atņemšana.
Šitais kods būs lētāks un ātrāks nekā atan2 rēķināšana.
To var nedaudz optimizēt, lai nerēķinātu "dārgo" sqrt operāciju, ja bumbiņas nesadurās:
Code: | delta = vB - vA
dist = delta . delta
if (dist < MINIMUM_DISTANCE2)
{
delta /= 2 * sqrt(dist)
vA -= delta
vB += delta
} |
kur delta.delta ir vektoru skalārais reizinājums (x*x+y*y)
un MINIMUM_DISTANE2 = MINIMUM_DISTANCE * MINIMUM_DISTANCE. |
|
Back to top |
|
|
Vecis
Joined: 01 Jan 2007 Posts: 144
|
Posted: Fri Jun 11, 2010 4:04 pm Post subject: |
|
Nu skaidrs, paldies |
|
Back to top |
|
|
|