Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

zamiana sinusa na kąt

Ostatnio zmodyfikowano 2016-06-17 17:52
Autor Wiadomość
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
P-149202
carlosmay
» 2016-06-17 10:18:30
asin() zwraca radiany,
które należy przeliczyć na kąt.
P-149204
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,
P-149206
darko202
» 2016-06-17 11:14:46
1.
a co chcesz osiągnąć ?

2.
Ogólnie możesz sam to sprawdzić stosując logiczne myślenie
używając np. wiedzy z 

http://www.cplusplus.com​/reference/cmath/sin/
http://www.cplusplus.com​/reference/cmath/asin/

http://www.matemaks.pl​/zamiana-stopni-na-radiany.html

no i wiedząc, że stopnie i radiany to tylko różnie wyrażone miary kąta

podobnie jak temperatura  T1 w stopniach Celsjusza = T2 w stopniach Kelwina  


3.

jakoś tak jest w matematyce, że
f(g(x))= x 
jeśli f jest funkcją odwrotną do g 
P-149209
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

C/C++
#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 ); //INFO: dopisane w tym rozdziale
    while( oknoAplikacji.isOpen() )
    {
       
        oknoAplikacji.clear( sf::Color::Black );
        obrazek.setOrigin( 20, 20 ); //INFO: dopisane w tym rozdziale
       
        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;
}
 
P-149213
michal11
» 2016-06-17 14:24:40
C/C++
rect.setRotation( angle * 180 / 3.141592f + 90 );

tylko musisz pamiętać żeby ustawić origin na środek sprita.
P-149217
Gibas11
» 2016-06-17 15:37:02
Mój kawałek kodu liczący kąt do obrotu na podstawie pozycji 2 ciał:

C/C++
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ś:
C/C++
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ć.
P-149219
mateczek
» 2016-06-17 17:52:08

asin(sin(liczba))


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.
P-149220
« 1 »
  Strona 1 z 1