Jak wyliczyc wektor przesuniecia majac kąt?

2013-04-15 18:06
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?

edytowany 2x, ostatnio: olesio, 2013-04-15 19:46
To działa dla każdego kąta. - _13th_Dragon 2013-04-15 21:19
Wiesz ze swoim komentarzem nie pomogles mi ani troche? Jesli juz zamierzasz mi jakos pomoc to moglbys rozwinac swoja wypowiedz, np. "To dziala dla kazdego kata, musisz tylko do wyniku dodac PI jesli jest mniejsze od 0" itd. Jesli natomiast nie masz ochoty mi pomagac to po prostu nie komentuj - michat34 2013-04-15 22:41
@michat34, więcej kultury. @_13th_Dragon, jesteś pewien, że działa dla każdego kąta? Sprawdziłeś dla angle = 0? - bogdans 2013-04-16 07:17
(0,-1) - poprawnie jak na odwrócenie pionu z poziomem, skoro to mu pasuje od 0 do 90 to musi pasować dla pozostałych. - _13th_Dragon 2013-04-16 09:11
Z drugą częścią się zgadzam - wzór albo jest poprawny dla wszystkich kątów, albo jest zupełnie do d*py. Autor nie napisał jak mierzy kąty (od jakiej półprostej, w którą stronę), jak jest skierowana oś OY (matematycznie do góry, czy programistycznie w dół). O co naprawdę chodzi autorowi , to wie on sam, choć tego też nie jestem pewien. - bogdans 2013-04-16 09:27
Ostatnie twoje zdanie w poprzednim komentarzu to chyba sedno sprawy. - _13th_Dragon 2013-04-16 10:10

Pozostało 580 znaków

2013-04-15 20:03
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

edytowany 1x, ostatnio: mr00zik, 2013-04-15 20:07

Pozostało 580 znaków

2013-04-16 07:14
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.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2013-04-16 08:43
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);

}

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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