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/external_slides/Przeksztalcenia_geometryczne/Przeksztalcenia_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