Matematický problém s úhly

Matematický problém s úhly
« kdy: 02. 04. 2013, 14:52:46 »
Zdravim!

Neviem ci som uplne blby, ale nijakovsky sa mi nedari vyriesit problem, ktory musim vyriesit aby som mohol pokracovat vo vyvoji mojej hry.
Problem je asi takyto:
Uhly idu do jedneho smeru kladne a do druheho zaporne. To znameno, ze uhol -180 a +180 je ten isty a tiez uhly ako -200 a 160 su rovnake. -350 je to iste ako 10 a naopak.
Problem je tento: mam zadany pociatocny uhol (moze byt aj 23281) a chcem zistit najmenej o kolko stupnov sa musim otocit aby som sa otocil na zadany uhol.
Priklad: pociatocny uhol je 170 a mam sa otocit na uhol -170. Musim sa otocit o +20 stupnov pretoze 170+20=190 je to iste ako -170 (nebudem sa otocit o -340).

Bol by som velmi vdacny tomu, kto by mi to algoritmicky vyriesil, samozrejme na rieseni budem dalej pracovat sam.
« Poslední změna: 02. 04. 2013, 18:30:19 od Petr Krčmář »


student

Re:Matematicky problem s uhlami
« Odpověď #1 kdy: 02. 04. 2013, 15:04:35 »
To staci vhodne odcitat, vymodulit a pridat k tomu 1 if a mame vysledok skor ako napiseme na forum prvu vetu. Alebo mi nieco nedochadza?

Sten

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

Jinak ten algoritmus je velmi snadný: (uhel + 180) % 360 - 180

Sten

Re:Matematicky problem s uhlami
« Odpověď #3 kdy: 02. 04. 2013, 15:10:10 »
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

prezek

  • ***
  • 229
    • Zobrazit profil
Re:Matematicky problem s uhlami
« Odpověď #4 kdy: 02. 04. 2013, 15:13:27 »
Citace
(uhel + 180) % 360 - 180)
pro -500 je výsledek -500, takže takhle asi ne.


prezek

  • ***
  • 229
    • Zobrazit profil
Re:Matematicky problem s uhlami
« Odpověď #5 kdy: 02. 04. 2013, 15:27:27 »
zkus třeba něco takového:
Kód: [Vybrat]
float delta = -10;
for (delta = -500; delta < 500; delta += 20)
    printf("%f %f\n", delta, delta - floor((delta + 180) / 360)*360);
, jestli to bude vyhovovat...

Re:Matematicky problem s uhlami
« Odpověď #6 kdy: 02. 04. 2013, 15:28:44 »
Citace
(uhel + 180) % 360 - 180)
pro -500 je výsledek -500, takže takhle asi ne.
To také asi záleží na jazyku v Common Lispu a Python vypadne -140.

prezek

  • ***
  • 229
    • Zobrazit profil
Re:Matematicky problem s uhlami
« Odpověď #7 kdy: 02. 04. 2013, 15:47:56 »
To také asi záleží na jazyku v Common Lispu a Python vypadne -140.
Python mi také vrátí 140, ale C mi vrací ve Win i v Linuxu -500, stejně jako C# a bash

Re:Matematicky problem s uhlami
« Odpověď #8 kdy: 02. 04. 2013, 15:57:26 »
/*
za správnost neručim, pokud tam je něco čemu nerozumíš tak to ber jako zdělávání  :-* :-* :-*
*/

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
   int uhelMam,uhelVstup,rozdil;
   int doblba=1;
   while(doblba)
      {
      printf("zadej mujUhel a uhelNaVstupu!!!!!!!!!\n")   ;
      scanf("%d",&uhelMam);
      scanf("%d",&uhelVstup);
      if(uhelMam<0)uhelMam=360-(abs(uhelMam)%360);
      uhelMam=uhelMam%360;
      if(uhelVstup<0)uhelVstup=360-(abs(uhelVstup)%360);
      uhelVstup=uhelVstup%360;
   rozdil=uhelVstup-uhelMam;
   if(rozdil<0)
      {if(rozdil<-180)rozdil+=360;}
   else if(rozdil>180)rozdil-=360;
   printf("Mam uhel: %d uhelVstup: %d otoceni: %d\n",uhelMam,uhelVstup,rozdil);
   
   printf("pokracovat doblba?????\n");
   scanf("%d",&doblba);
      }
   
   
   return 0;
}
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š!

Sten

Re:Matematicky problem s uhlami
« Odpověď #9 kdy: 02. 04. 2013, 16:03:13 »
Citace
(uhel + 180) % 360 - 180)
pro -500 je výsledek -500, takže takhle asi ne.

Hmm, zkoušel jsem to v Pythonu, nenapadlo mě, že to v C bude fungovat jinak. OK, jde to celkem snadno opravit:

Kód: [Vybrat]
int posun = uhel >= 0 ? 180 : -180;
return (uhel + posun) % 360 - posun;

Re:Matematicky problem s uhlami
« Odpověď #10 kdy: 02. 04. 2013, 16:41:13 »
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.

Jarek

Re:Matematicky problem s uhlami
« Odpověď #11 kdy: 02. 04. 2013, 17:09:57 »
Kód: [Vybrat]
asin(sin(uhel))
Netvrdím, že je to optimální, nicméně je to elegantní ;)

Jarek

Re:Matematicky problem s uhlami
« Odpověď #12 kdy: 02. 04. 2013, 17:21:12 »
Teď mi došlo, že by to nefungovalo kvůli 0 a 180 stupnu. Tak jinak:
Kód: [Vybrat]
sin(u1) == sin(u2) && cos(u1) == cos(u2)
To uz neni tak elegantni ;)

Jarek

Re:Matematicky problem s uhlami
« Odpověď #13 kdy: 02. 04. 2013, 17:29:54 »
Jinak moc nerozumím tomu, proč plýtvat energií na normalizaci úhlu otočení? Jestli se otočím o +10 nebo +370 stupňů musí být ve výsledku jedno, protože v konečné fázi ten úhel při výpočtu čehokoliv stejně skončí v nějaké goniometrické funkci, která to spočítá správně, tak proč se s tím otravovat předem?

Re:Matematicky problem s uhlami
« Odpověď #14 kdy: 02. 04. 2013, 17:37:12 »
Jinak moc nerozumím tomu, proč plýtvat energií na normalizaci úhlu otočení? Jestli se otočím o +10 nebo +370 stupňů musí být ve výsledku jedno, protože v konečné fázi ten úhel při výpočtu čehokoliv stejně skončí v nějaké goniometrické funkci, která to spočítá správně, tak proč se s tím otravovat předem?

No ono v mojom pripade to naozaj je dolezite, pretoze nie je jedno, ci sa otocit 150x okolo svojej osi a stale budes otoceny smerom k obrazovke alebo sa nepohnes vobec a bude otoceny tym istym smerom. Jedna sa totiz o hru, v ktorej otocenie zaberie aj nejaky cas.