dev.gamez.lv Forum Index dev.gamez.lv
Latvian Game Developers Community
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups 

Dots nogrieznis vajag iegūt tā leņķi

 
dev.gamez.lv Forum Index -> Iesācējiem
View previous topic :: View next topic  
Author Message
Vecis



Joined: 01 Jan 2007
Posts: 144

PostPosted: 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
View user's profile Send e-mail
DeRatizators



Joined: 27 Apr 2006
Posts: 492

PostPosted: 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 Smile 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
View user's profile
snake5
Indago dalībnieks
Indago dalībnieks


Joined: 27 Jun 2007
Posts: 2590

PostPosted: 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
View user's profile Visit poster's website
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: 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
View user's profile Visit poster's website
Vecis



Joined: 01 Jan 2007
Posts: 144

PostPosted: 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 Wink
Code:

import math
alpha=math.atan2(y2-y,x2-x)*180/math.pi
Back to top
View user's profile Send e-mail
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: 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
View user's profile Send e-mail
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: 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
View user's profile Visit poster's website
Vecis



Joined: 01 Jan 2007
Posts: 144

PostPosted: Fri Jun 11, 2010 2:17 pm    Post subject:

Kodā ir otrādi, tas tāds sīkums attēlā ko sajaucu. Wink
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
View user's profile Send e-mail
snake5
Indago dalībnieks
Indago dalībnieks


Joined: 27 Jun 2007
Posts: 2590

PostPosted: Fri Jun 11, 2010 2:22 pm    Post subject:

Ož tiešām pēc nepieciešamības strādāt ar vektoriem. Smile
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
View user's profile Visit poster's website
Vecis



Joined: 01 Jan 2007
Posts: 144

PostPosted: 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
View user's profile Send e-mail
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: 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
View user's profile Send e-mail
Vecis



Joined: 01 Jan 2007
Posts: 144

PostPosted: Fri Jun 11, 2010 4:04 pm    Post subject:

Nu skaidrs, paldies Wink
Back to top
View user's profile Send e-mail
Display posts from previous:   
dev.gamez.lv Forum Index -> Iesācējiem All times are GMT + 2 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group