Matematický problém s úhly

Re:Matematicky problem s uhlami
« Odpověď #15 kdy: 02. 04. 2013, 17:37:45 »
Těch -170 má být +10, ne +20 ;-)

Hmm, špatně jsem pochopil, co se tam počítá, těch +20 je správně. Ten algoritmus pak stačí vhodně upravit:

(koncovy - pocatecni + 180) % 360 - 180

Super, dakujem :D toto funguje absolutne dokonale!


Jarek

Re:Matematicky problem s uhlami
« Odpověď #16 kdy: 02. 04. 2013, 17:44:59 »
Nevím přesne, co děláš, ale možná na to jdeš špatně. Zkus se podívat quaternion, tak se to obvykle řeší ve hrách:
http://kengine.sourceforge.net/tutorial/vc/quaternion.htm
http://en.wikipedia.org/wiki/Quaternion

Sten

Re:Matematicky problem s uhlami
« Odpověď #17 kdy: 02. 04. 2013, 18:15:00 »
Těch -170 má být +10, ne +20 ;-)

Hmm, špatně jsem pochopil, co se tam počítá, těch +20 je správně. Ten algoritmus pak stačí vhodně upravit:

(koncovy - pocatecni + 180) % 360 - 180

Super, dakujem :D toto funguje absolutne dokonale!

Jak výše někdo podotkl, je tam chyba, pro zápornou hodnotu koncovy - pocatecni je potřeba otočit znaménka u těch 180.

Re:Matematicky problem s uhlami
« Odpověď #18 kdy: 02. 04. 2013, 18:22:58 »
Těch -170 má být +10, ne +20 ;-)

Hmm, špatně jsem pochopil, co se tam počítá, těch +20 je správně. Ten algoritmus pak stačí vhodně upravit:

(koncovy - pocatecni + 180) % 360 - 180

Super, dakujem :D toto funguje absolutne dokonale!

Jak výše někdo podotkl, je tam chyba, pro zápornou hodnotu koncovy - pocatecni je potřeba otočit znaménka u těch 180.

Nie je to treba. Funguje to perfektne pre vsetky pripady. Otestoval som priamo v hre.

Re:Matematický problém s úhly
« Odpověď #19 kdy: 02. 04. 2013, 18:46:41 »
A funguje to i kdyz je koncovy = -180 a pocatecni = 180?
Protoze pak je to (alespon v C) (-180-180+180)%360-180=-180-180=-360 misto 0 (protoze % na zaporne cislo vraci zaporne cislo - on je to ve skutecnosti operator "zbytek po celociselnem deleni" definovany pro A % B jako "nejmensi cele cislo C takove, ze C*B <= A", nebo podle c99 "(A/B) * B + A%B = A" (kde "/" je celociselne deleni, ktere zaokrouhluje smerem k nule)) - to prave zalezi na pouzitem jazyku, jestli % definuje pres zbytek po deleni, nebo jinak.

Ja bych tam navrhnul ((koncovy-pocatecni)%360+360+180)%360-180 // 360+180 dopocita kompilatorpri prekladu, do zdrojaku to napisu rozdelene aby bylo jasnejsi odkud se ktere cislo bere
Pokud mam zaruceno ze oba vstupni uhly jsou mezi -180 a +180, tak si muzu vystacit s (koncovy-pocatecni+360+180)%360-180


Sten

Re:Matematický problém s úhly
« Odpověď #20 kdy: 02. 04. 2013, 19:49:47 »
A funguje to i kdyz je koncovy = -180 a pocatecni = 180?
Protoze pak je to (alespon v C) (-180-180+180)%360-180=-180-180=-360 misto 0 (protoze % na zaporne cislo vraci zaporne cislo - on je to ve skutecnosti operator "zbytek po celociselnem deleni" definovany pro A % B jako "nejmensi cele cislo C takove, ze C*B <= A", nebo podle c99 "(A/B) * B + A%B = A" (kde "/" je celociselne deleni, ktere zaokrouhluje smerem k nule)) - to prave zalezi na pouzitem jazyku, jestli % definuje pres zbytek po deleni, nebo jinak.

Ja bych tam navrhnul ((koncovy-pocatecni)%360+360+180)%360-180 // 360+180 dopocita kompilatorpri prekladu, do zdrojaku to napisu rozdelene aby bylo jasnejsi odkud se ktere cislo bere
Pokud mam zaruceno ze oba vstupni uhly jsou mezi -180 a +180, tak si muzu vystacit s (koncovy-pocatecni+360+180)%360-180

Jednodušší je otočit znaménka u těch 180 (obou), pokud je koncovy - pocatecni menší než 0, ušetříte tak jedno dělení:
Kód: [Vybrat]
int uhel = koncovy - pocatecni;
int posun = uhel >= 0 ? 180 : -180;
return (uhel + posun) % 360 - posun;

Re:Matematický problém s úhly
« Odpověď #21 kdy: 02. 04. 2013, 20:25:44 »
To jsem nevěřil vlastním očím, když jsem tohle viděl na wiki:
Citace
The case of general integers

If a and d are integers, with d non-zero, then a remainder is an integer r such that a = qd + r for some integer q, and with |r| < |d|.

When defined this way, there are two possible remainders. For example, the division of −42 by −5 can be expressed as either
−42 = 9×(−5) + 3

as is usual for mathematicians,[citation needed] or
−42 = 8×(−5) + (−2).

So the remainder is then either 3 or −2.
Je to odsud: http://en.wikipedia.org/wiki/Remainder

V diskuzi je to zkritizováno, aby taky ne.
-42 div 9 = -5 ?

Re:Matematický problém s úhly
« Odpověď #22 kdy: 02. 04. 2013, 20:43:40 »
A funguje to i kdyz je koncovy = -180 a pocatecni = 180?
Protoze pak je to (alespon v C) (-180-180+180)%360-180=-180-180=-360 misto 0 (protoze % na zaporne cislo vraci zaporne cislo - on je to ve skutecnosti operator "zbytek po celociselnem deleni" definovany pro A % B jako "nejmensi cele cislo C takove, ze C*B <= A", nebo podle c99 "(A/B) * B + A%B = A" (kde "/" je celociselne deleni, ktere zaokrouhluje smerem k nule)) - to prave zalezi na pouzitem jazyku, jestli % definuje pres zbytek po deleni, nebo jinak.

Ja bych tam navrhnul ((koncovy-pocatecni)%360+360+180)%360-180 // 360+180 dopocita kompilatorpri prekladu, do zdrojaku to napisu rozdelene aby bylo jasnejsi odkud se ktere cislo bere
Pokud mam zaruceno ze oba vstupni uhly jsou mezi -180 a +180, tak si muzu vystacit s (koncovy-pocatecni+360+180)%360-180

No v Pythone som to napisal priblizne takto:

def posun(pociatocny, koncovy):
  return (koncovy - pociatocny + 180) % 360 - 180


A nech je to akokolvek divne tak: posun(180, -180) je 0 aj posun(-180, 180) je 0. Takze mne takato funkcia funguje velmi dobre.

Jarek

Re:Matematický problém s úhly
« Odpověď #23 kdy: 02. 04. 2013, 20:56:04 »
Já teda nevím, ale mám pocit, že se tady znovuobjevuje kolo. Jako všechno, co tu bylo napsáno, asi pro určité případy funguje, ale proč to neudělat obecně a správně? Udělat z úhlu jednotkový 2D vektor je snadné a výpočet úhlu mezi vektory je matematiky dobře zvládnutá a zdokumentovaná úloha :). Tady je několik způsobů, jak na to:
http://www.euclideanspace.com/maths/algebra/vectors/angleBetween/
a v pythonu:
http://stackoverflow.com/questions/2827393/angles-between-two-n-dimensional-vectors-in-python

prezek

  • ***
  • 229
    • Zobrazit profil
Re:Matematický problém s úhly
« Odpověď #24 kdy: 02. 04. 2013, 21:22:55 »
A nech je to akokolvek divne tak: posun(180, -180) je 0 aj posun(-180, 180) je 0. Takze mne takato funkcia funguje velmi dobre.

Už jsme se o tom minimálně ve 3 příspěvcích zmínili, že Python počítá modulo záporných čísel jinak, než třeba C. Při takovémto řešení ale podstupuješ riziko, že v jiné implementaci Pythonu změní názor a budou počítat modulo tak, jako C, C#, Bash, Javascript ... Já bych se bál takové řešení použít. Buď bych po přepočtu zkontroloval, zda je číslo v rozsahu -180 až 180 a příslušně upravil +-360, nebo bych použil ten vzorec, co jsem už psal.
Kód: [Vybrat]
float delta=beta-alfa;
delta-=floor((delta + 180) / 360)*360;

Re:Matematicky problem s uhlami
« Odpověď #25 kdy: 03. 04. 2013, 21:22:24 »
Citace
Jinak ten algoritmus je velmi snadný: (uhel + 180) % 360 - 180
Jazyk, který by mi pro -500 vrátil cokoli jiného než -500 bych rovnou smazal z disku.
Proto taky v CL je na výběr mezi mod a rem.

Re:Matematický problém s úhly
« Odpověď #26 kdy: 04. 04. 2013, 13:32:17 »
Já teda nevím, ale mám pocit, že se tady znovuobjevuje kolo. Jako všechno, co tu bylo napsáno, asi pro určité případy funguje, ale proč to neudělat obecně a správně? Udělat z úhlu jednotkový 2D vektor je snadné a výpočet úhlu mezi vektory je matematiky dobře zvládnutá a zdokumentovaná úloha :). Tady je několik způsobů, jak na to:
http://www.euclideanspace.com/maths/algebra/vectors/angleBetween/
a v pythonu:
http://stackoverflow.com/questions/2827393/angles-between-two-n-dimensional-vectors-in-python

Nazdar!

Ještě takovou jednu doplňující otázku. Co bude šlapat rychleji, ty modula nebo tadleta matika?
Díky
Bible Kralická, přísloví 26

3 Bič na koně, uzda na osla, a kyj na hřbet blázna.
7 Jakož nejednostejní jsou hnátové kulhavého, tak řeč v ústech bláznů.
14 Dvéře se obracejí na stežejích svých, a lenoch na lůži svém.
27 Kdo jámu kopá, do ní upadá, a kdo valí kámen, na něj se obrací.

Krleš!

Jarek

Re:Matematický problém s úhly
« Odpověď #27 kdy: 04. 04. 2013, 14:01:14 »
Ještě takovou jednu doplňující otázku. Co bude šlapat rychleji, ty modula nebo tadleta matika?
To je špatně položená otázka ;). Ty modula jsou rychlejší, ale jen z toho důvodu, že autor původního dotazu zvolil špatný matematický aparát pro popis problému. Používat úhly k popisu orientace je ve hrách neobvyklé, mnohem praktičtejší je směrový vektor nebo quaternion. Vektory mají tu výhodu, že fungují stejně pro N-dimenzionální prostor (2D i 3D), matematika kolem toho je pořád ta stejná. Kdyby použil směrový vektor nebo quaternion, nemusí vůbec řešit normalizaci úhlu. Navíc při výpočtech s rotačními úhly narazí v 3D prostoru na tohle: http://en.wikipedia.org/wiki/Gimbal_lock, což se mu s quaternionem nestane.

Re:Matematický problém s úhly
« Odpověď #28 kdy: 05. 04. 2013, 10:05:41 »
Jarek: pouzivam fyzikalnu kniznicu PyMunk a v nej GearJoint pre vytvorenie klbu medzi dvoma objektami. GearJoint urcuje UHOL, ktory maju dane objekty zvierat. Preto nemozem pouzit vektory ani nic podobne ale uhly (samozrejme v radianoch).

Jarek

Re:Matematický problém s úhly
« Odpověď #29 kdy: 05. 04. 2013, 10:48:34 »
Jarek: pouzivam fyzikalnu kniznicu PyMunk a v nej GearJoint pre vytvorenie klbu medzi dvoma objektami. GearJoint urcuje UHOL, ktory maju dane objekty zvierat. Preto nemozem pouzit vektory ani nic podobne ale uhly (samozrejme v radianoch).
Aha to je 2D, tak pro 2D je quaternion trochu overkill, ale stejně bych pro svoje interní výpočty použil směrový vektor a teprve až když by bylo potřeba zavolat tu knihovnu, tak bych spočítal úhel směrového vektoru. Nemusíš řešit normalizaci úhlu a je to obecnější řešení.