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

Obliczanie nowego położenia punktu po obrocie

Ostatnio zmodyfikowano 2014-02-15 16:23
Autor Wiadomość
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 ;)
Wyszukiwanie punktu (x', y') po obrocie
Wyszukiwanie punktu (x', y') po obrocie
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.
P-104659
Gabes
» 2014-02-15 14:54:35
P-104661
RazzorFlame
Temat założony przez niniejszego użytkownika
» 2014-02-15 15:30:14
Nie o to chodzi, przeczytaj dokładnie.
P-104665
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..
P-104668
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.
P-104669
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:
C/C++
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 ) );
   
    /*x' = r cos ( q + f ) = r cos q cos f - r sin q sin f
            y' = r sin ( q + w ) = r sin q cos f + r cos q sin f*/
   
    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 ;)
P-104670
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.
P-104671
pekfos
» 2014-02-15 15:46:39
C/C++
if( newRotation > m_MaxRotation ) newRotation = m_MaxRotation;

if( newRotation > m_MinRotation ) newRotation = m_MinRotation;

Na pewno?

C/C++
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.
P-104672
« 1 » 2
  Strona 1 z 2 Następna strona