RazzorFlame Temat założony przez niniejszego użytkownika |
Obliczanie nowego położenia punktu po obrocie » 2014-02-15 14:21:36 Witam. Problem jest bardziej związany z samymi wzorami a nie z programowaniem. Chodzi o to, że mając linię o początku m_From (sf::Vector2f) i końcu m_To (sf::Vector2f) chcę wyszukać nową pozycję po obrocie. Obrót następuje względem m_From. Tutaj zobrazowana wersja mojego problemu ;) Mamy do dyspozycji kąt obrotu (F), m_From, m_To oraz odległość początkową od m_From do m_To (Z). Dodam również że przeszukiwałem bibliotekę SFML jednak tam linia jest zazwyczaj reprezentowana jako prostokąt a działania są wykonywane na macierzach, a ja chciałbym ominąć większość tych obliczeń. Po wyszukaniu na google ukazało mi się parę wyników np.: x' = x cos f - y sin f y' = y cos f + x sin f
No ale jak się domyślacie, te wzory nie działają w sposób jaki bym chciał. Dla przykładu, linia o punktach takich jak są pokazane na obrazku po obrocie o 3 st. w prawo jest tak zniekształcona, że szkoda gadać - m_To znajduje się wtedy nad i trochę na lewo od m_From tak jakbym obrócił to o ~250 st. Coś chyba jest nie tak co nie? ;) Dodam że na stronie na której to zobaczyłem ( tutaj) piszą też coś o "translatowaniu" (nie wiem jak to się po polsku zwie, bo raczej "tłumaczenie" nie jest poprawnym określeniem) pozycji. |
|
Gabes |
» 2014-02-15 14:54:35 |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2014-02-15 15:30:14 Nie o to chodzi, przeczytaj dokładnie. |
|
pekfos |
» 2014-02-15 15:37:38 po obrocie o 3 st. w prawo jest tak zniekształcona, że szkoda gadać - m_To znajduje się wtedy nad i trochę na lewo od m_From tak jakbym obrócił to o ~250 st |
Zamieniłeś na radiany? "3" to prawie 172 stopnie, więc.. |
|
Gabes |
» 2014-02-15 15:38:12 Czy chodzi ci oto aby odcinek obracał się jak wskazówka na zegarze ? wokół punktu obrotu, tak to zrozumiałem. |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2014-02-15 15:40:32 Pekfos, wiadomo że tak. Może prześle wam jak to aktualnie wygląda: void Bone::rotate( float angle ) { float newRotation = angle + m_ActualRotation; if( newRotation >= 360 ) { newRotation = 0 + newRotation - 360; } if( newRotation < 0 ) { newRotation = 360 + newRotation; } if( newRotation > m_MaxRotation ) newRotation = m_MaxRotation; if( newRotation > m_MinRotation ) newRotation = m_MinRotation; double bokA, bokB, bokC; bokA = fabs( m_To.x - m_From.x ); bokB = fabs( m_To.y - m_From.y ); bokC = sqrt( pow( bokA, 2 ) + pow( bokB, 2 ) ); sf::Vector2f newPosition; newPosition.x = bokC * cos( m_ActualRotation *( M_PI / 180 ) ) * cos( angle *( M_PI / 180 ) ) -( bokC * sin( m_ActualRotation *( M_PI / 180 ) ) * sin( angle *( M_PI / 180 ) ) ); newPosition.y = bokC * sin( m_ActualRotation *( M_PI / 180 ) ) * cos( angle *( M_PI / 180 ) ) +( bokC * cos( m_ActualRotation *( M_PI / 180 ) ) * sin( angle *( M_PI / 180 ) ) ); m_To = newPosition; m_ActualRotation = newRotation; }
Kod aktualnie wykorzystuje wzór który jest w komentarzu nad obliczaniem pozycji. Edit: Cały czas próbuje ogarnąć te macierze z SFML ;) |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2014-02-15 15:46:34 Czy chodzi ci oto aby odcinek obracał się jak wskazówka na zegarze? |
Nie, chodzi o to by obliczyć nową pozycje końca linii po obrocie. Jest mi to potrzebne bo zamierzam zrobić grę ze stickman-ów a kość musi być "przytwierdzona" do nadrzędnej kości. |
|
pekfos |
» 2014-02-15 15:46:39 if( newRotation > m_MaxRotation ) newRotation = m_MaxRotation;
if( newRotation > m_MinRotation ) newRotation = m_MinRotation;
|
Na pewno? bokA = fabs( m_To.x - m_From.x ); bokB = fabs( m_To.y - m_From.y ); bokC = sqrt( pow( bokA, 2 ) + pow( bokB, 2 ) ); |
Zbędne pow() i fabs(). Kod aktualnie wykorzystuje wzór który jest w komentarzu nad obliczaniem pozycji. |
Nie analizowałem dokładnie, ale nawet nie wygląda podobnie. PS: Implementacja niepotrzebnie zagmatwana, obliczasz na nowo wartości, które już masz zapisane w zmiennych. Wzór dotyczy obrotu względem początku układu współrzędnych. Obszedłeś to, ale wynik dalej jest względem początku układu, a nie punktu m_To. |
|
« 1 » 2 |