pajdas Temat założony przez niniejszego użytkownika |
zamiana sinusa na kąt » 2016-06-17 09:49:42 piszę program w sfml, gdzie strzałka będzie przekręcać się w stronę kursora. Wszysko mam już opracowane poza wzorem zamiany sinusa na kąt. Czytałem że robi się to funkcja arcus sinus ale nie wiem jak to używać, co to jest i jak to zapisać w c++.
Świetną odpowiedzią będzie prosty kod w konsoli który obliczy kąt z sinusa równego np. 0.75 z góry dzięki za odpowiedz |
|
carlosmay |
» 2016-06-17 10:18:30 asin() zwraca radiany, które należy przeliczyć na kąt. |
|
pajdas Temat założony przez niniejszego użytkownika |
» 2016-06-17 10:23:41 czyli angle = asin(sin(liczba)) ∙ 180°/ π to jest dobrze czy źle,
|
|
darko202 |
» 2016-06-17 11:14:46 |
|
pajdas Temat założony przez niniejszego użytkownika |
» 2016-06-17 13:51:14 Mam taki kod, proszę kogoś doświadczonego w sfml aby powiedział mi co mam zrobić żeby obrazek obracał się w stronę kursora. Wiem że ten kod jest BARDZO źle napisany ale jakoś tam działa, dopiero się uczę. wymyśliłem to sobie tak: jest trójkąt ABC, w tym trójkącie można wyznaczyć kąt CBA(B jest w środku) Punkt Ax i Ay to pozycja myszy. Punkt Bx i By to pozycja obrazka. Trójkąt jest prostokątny czyli Cx = Bx, a Cy = Ay. Teraz wystarczy obliczyć długość prostej |CB| oraz |BA| a potem podzielić je przez siebie, wynika to z kodu sin alfa = a/c. Kto przerobi mi ten kod żeby działał tak jak chce. Nie przerabiajcie tego co mam (o ile będzie to możliwe), ja to sobie wszystko poprawię. Zwracam się do was o pomoc bo chodzę dopiero do drugiej gimnazjum i nie mam wiedzy na temat sin i cos #include <SFML/Graphics.hpp> #include <cmath>
int SPEED = 250;
sf::Texture tekstura; sf::Sprite obrazek;
double angle;
int main() { sf::Texture tekstura; sf::Sprite obrazek; sf::RenderWindow oknoAplikacji( sf::VideoMode( 640, 480, 32 ), "ruch w SFML" ); tekstura.loadFromFile( "box.jpg" ); obrazek.setTexture( tekstura ); sf::Clock frameClock; obrazek.setPosition( 20, 20 ); while( oknoAplikacji.isOpen() ) { oknoAplikacji.clear( sf::Color::Black ); obrazek.setOrigin( 20, 20 ); sf::Vector2i pozycjaMyszy = sf::Mouse::getPosition( oknoAplikacji ); sf::Vector2f rectPos( obrazek.getPosition() ); angle = atan2(( pozycjaMyszy.y - rectPos.y ),( pozycjaMyszy.x - rectPos.x ) ); float dt = frameClock.restart().asSeconds(); if( sf::Keyboard::isKeyPressed( sf::Keyboard::W ) ) { obrazek.move( cos( angle ) * SPEED * dt, sin( angle ) * SPEED * dt ); } oknoAplikacji.draw( obrazek ); oknoAplikacji.display(); } return 0; }
|
|
michal11 |
» 2016-06-17 14:24:40 rect.setRotation( angle * 180 / 3.141592f + 90 );
tylko musisz pamiętać żeby ustawić origin na środek sprita. |
|
Gibas11 |
» 2016-06-17 15:37:02 Mój kawałek kodu liczący kąt do obrotu na podstawie pozycji 2 ciał: float atan2f( const float x, const float y ) { float r; if(( x == 0.0f ) &&( y == 0.0f ) ) return 0.0; if( fabsf( y ) >= fabsf( x ) ) { r = atanf( x / y ); if( y < 0.0 ) r +=( x >= 0 ? PI : - PI ); } else { r = - atanf( y / x ); r +=( x < 0.0f ? - HALF_PI: HALF_PI ); } return r; }
float rotate_to_ff( const sf::Vector2f & point1, const sf::Vector2f & point2 ) { float dx = point2.x - point1.x; float dy = point2.y - point1.y; float radian = atan2f( dy, dx ); return( radian * 180 / PI ); }
Potem wystarczy takie coś: obj1.setRotation( obj1.getPosition(), obj2.getPosition() );
EDIT: To prawie to samo, tylko opakowane ładnie w funkcje i z odrobinę innym algorytmem, ale uznałem że może Ci się przydać. |
|
mateczek |
» 2016-06-17 17:52:08 2*liczba/2 = liczba //mnożenie i dzielenie to działania odwrotne sqrt(liczba^2)=liczba //potęgowanie i pierwiastkowanie to działania odworotne log(10^liczba)=liczba //logarytmowanie i funkcja wykładnicza to działania odwrotne asin(sin(liczba))=liczba // analogicznie itp itd.
|
|
« 1 » |