Jak wyliczyc wektor przesuniecia majac kąt?

0

Witam w jaki sposob moge obliczyc wektor przesuniecia X i Y majac podany kąt w stopniach? Czyli np. o ile sie przesunie obiekt jesli jego rotacja wynosi 60st a o ile jesli wynosi 210?

double shiftX = Math.sin(Math.toRadians(angle));
double shiftY = -Math.cos(Math.toRadians(angle));

To dziala tylko dla katow >=0 i <90. Jak da sie inaczej wyliczyc wektor przesuniecia?

0

Nowe położenie możesz wyliczyć przy pomocy macierzy obrotu i chyba o to Ci chodzi.
http://smurf.mimuw.edu.pl/ext[...]ksztalcenia_geometryczne.html

0

Wzory, które podałeś są błędne dla każdego (prawie) kąta. W pierwszej ćwiartce dają poprawny wynik tylko dla kąta 45 stopni. Powinno być

double shiftX = Math.cos(Math.toRadians(angle));
double shiftY = znak*Math.sin(Math.toRadians(angle));

Zmienna znak ma wartość 1 w matematyce (oś OY skierowana w górę), -1 przy rysowaniu w Javie i paru innych językach (oś OY jest skierowana w dół).
Wzory są poprawne dla każdego kąta.

0

Nie wiem czy dobrze rozumiem wektor przesunięcia ale masz tu kawałek kodu klasy cPoint, za pomocą którego obrócisz zadany punkt wokół aktualnego punktu

const double cntAnglesToRadians = 3.14159265358979 / 180;       //stała przekształcająca stopnie na radiany

cPoint cPoint::GetNewPointRotated(double xDisX, double xDisY, double xAngle){
    //funkcja zwracająca nowy punkt, obrócony wokół aktualnego obiektu o zadany kąt
    //xDisX, xDisY - pozycja obracanego punktu wyrażona w odległościach X,Y od punktu obrotu
    //xAngle - kąt, o jaki należy obrócić punkt

    float pX, pY;

    pX = this->X + (xDisX * cos(xAngle * cntAnglesToRadians)) - (xDisY * sin(xAngle * cntAnglesToRadians));
    pY = this->Y + (xDisX * sin(xAngle * cntAnglesToRadians)) + (xDisY * cos(xAngle * cntAnglesToRadians));

    return cPoint(pX, pY);

}

cPoint cPoint::GetNewPointRotated(const cPoint *xPt, double xAngle){
    //funkcja zwracająca nowy punkt, obrócony wokół aktualnego obiektu o zadany kąt
    //xPt - pozycja obracanego punktu   
    //xAngle - kąt, o jaki należy obrócić punkt

    double pDisX, pDisY;

    pDisX = xPt->X - this->X;           //odległość punktów na osi X od siebie
    pDisY = xPt->Y - this->Y;           //odległość punktów na osi Y od siebie

    return GetNewPointRotated(pDisX, pDisY, xAngle);

}

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0