RazzorFlame Temat założony przez niniejszego użytkownika |
"Wyciąganie" kąta z funkcji trygonometrycznych » 2013-03-15 08:38:20 Siostra mi powiedziała jak to zrobić no ale jest pytanie: Czy jest jakiś wzór na obliczenie tego czy trza brać ciągle z tabeli? Hmm teraz mi tak przyszło do głowy czy by tak nie zrobić: int GetAngle( double a, double b ) double c, c2; c2 = pow( a, 2 ) + pow( b, 2 ); c = sqrt( c2 ); int kat = 0; for( kat = 0; sin( getRadian( kat ) != a / c; kat++ ) { }
return kat; }
Czy to zadziała? |
|
pekfos |
» 2013-03-15 14:49:19 Nie zadziała. Czy jest jakiś wzór na obliczenie tego czy trza brać ciągle z tabeli? |
Są funkcje cyklometryczne. |
|
ison |
» 2013-03-15 15:03:42 |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2013-03-15 16:20:24 Coś czytałem o tym że to przeciwieństwo Czy to jest to że robi się totalnie odwrotnie? Że podajesz długości masz kąt czy co? I jeszcze jedno - czym różni się funkcja atan od funkcji atan2? |
|
pekfos |
» 2013-03-15 16:29:04 Czy to jest to że robi się totalnie odwrotnie? Że podajesz długości masz kąt czy co? |
Jakie długości? Z kąta masz sinus więc z sinusa masz kąt. Totalnie odwrotnie. czym różni się funkcja atan od funkcji atan2? |
Leń. Dostałeś linki do dokumentacji. Bez trudu znajdziesz tam też atan i atan2. |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2013-03-15 17:26:06 Hehe dzięki ;) Doobra pooszukam ;p
Edit: Poradziłem sobie: Obliczam ręcznie przeciwprostokątną a później używam 'asin' i tzw. result z funkcji to wartość asin przeliczony na stopnie ;) |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2013-03-16 11:33:26 Edit coś nie działa HMM paczajcie: Trygonometria.cpp (w trygonometria.h mam deklaracje) #include "Trygonometria.h"
double getAngle( int aX, int aY, int bX, int bY ) { int a = abs( bX - aX ); int b = abs( bY - aY ); long double c, c2; c2 = pow( a, 2 ) + pow( b, 2 ); c = sqrt( c2 ); long double angle = asin(( long double )( a / c ) ); angle =( long double )( 180 * angle / M_PI ); return angle; } long double getSinCos( char sc, int angle ) { if( sc == GETSINUS ) { return sin(( M_PI * angle / 180 ) ); } else if( sc == GETCOSINUS ) { return cos(( M_PI * angle / 180 ) ); } else return RETNULL; }
Używam tego tak (main.cpp) #include "main.h" #include "Trygonometria.h"
using namespace std;
int main() { sf::RenderWindow app( sf::VideoMode( 800, 600, 32 ), "Okienko", sf::Style::Close ); sf::Event ev; sf::Image imgAndrew; imgAndrew.LoadFromFile( "obrazek.bmp" ); imgAndrew.CreateMaskFromColor( sf::Color( 255, 0, 255 ) ); imgAndrew.SetSmooth( false ); sf::Sprite spr( imgAndrew ); spr.SetCenter( 20, 20 ); double x = 400, y = 300; spr.SetPosition( x, y ); double mouseX = 0, mouseY = 0; while( app.IsOpened() ) { while( app.GetEvent( ev ) ) { if( ev.Type == sf::Event::Closed ) app.Close(); if( ev.Type == sf::Event::MouseMoved ) { mouseX = ev.MouseMove.X; mouseY = ev.MouseMove.Y; } } spr.SetRotation( getAngle( x, y, mouseX, mouseY ) ); app.Clear( sf::Color( 0, 0, 255 ) ); app.Draw( spr ); app.Display(); } return 0; }
Zły kąt pokazuje, gdzie może być błąd? |
|
pekfos |
» 2013-03-16 12:40:26 Twój kod na obliczanie kąta jest bezsensowny. Wyliczając wartość bezwzględną z różnic tracisz informacje o ćwiartce układu. Dodatkowo sam kąt wyliczasz nieefektywnie. Niepotrzebnie obliczasz przeciwprostokątną. Niedokładny? A może odwrócony o 180 stopni w kierunku przeciwnym do odwrotnego? |
|
« 1 » 2 |