Punkt um gegebenes Zentrum rotieren



  • Hi,

    ich habe hier einen Punkt an der Koordinate x,y und einen Rotationsmittelpunkt an cx,cy. Den Punkt möchte ich jetzt mit einem Winkel von a um diesen Mittelpunkt rotieren.

    Kann mir jemand die passende Formel geben? Die Rotation alleine würde ich vermutlich ja noch hinkriegen, aber da x,y im Vergleich zu cx,cy schon irgend wie rotiert sein kann und ich im Prinzip weiterdrehen muss, komme ich leider gar nicht klar.

    Danke!



  • auf Mathematische Korrekheit würde ich jetz erstmal keine Garantie geben :), aber wenn ich dich richtig verstanden habe sollte das deinen Lösungsweg beschreiben. Also X/Y SIN/COS bring ich immer durcheinander kann sein das du dir das noch anpassen musst aber habs auch Visualisiert ausgegeben und funnzt so wie soll!

    float psx=150; // dot source X
    float psy=150; // dot source Y
    
    float cx=300; // center X
    float cy=300; // center y
    
    float deg2center= atan2 ( (psx-cx), (psy-cy ) ); // Dein Sourcewinkel !
    
    float pdx=cx+sin(deg2center+Your_Degrees);  // Destination Y
    float pdy=cy+cos(deg2center+Your_Degrees);  // Destination X
    
    // pdx*=100;
    // pdy*=100;
    // myRC.drawoval (pdx,pdy,10,10)  ;  <-GLIB COMMANDS !   
    // myRC.drawoval (300,300,10,10,1);  <-GLIB COMMANDS !
    

    Hab das mal eben zum testen in meinen Code reingepappt 🙂 Die Kugel richtet sich zur Maus hin aus, Source liegt bei is aber wie gesagt flink reingepappt in eine andere Spielerei *GRIEEEN, Deg2Center zeigt dir den Winkel an. (such einfach nach Deg2Center in main.cpp dann findest du den Codeabschnitt!!)

    Wer evtl. das ganze mit Source haben will kann sich von meiner Seite SL_GLIB im SimpleLibs Packet runterladen!

    http://c64.feuerware.com/download/JumpingGummiBalls.rar

    mfg. Patrick_C64 (ps: hätte nix gegen Feedback 😉 !)



  • Das funktioniert leider vorne und hinten nicht:

    float deg2center= atan2 ( (psx-cx), (psy-cy ) );
    

    Der Teil produziert bei mir eine extrem kleine Zahl (irgend was mit >200 Nullen hinter dem Komma). Wenn ich x und y tausche, sieht es etwas besser aus, dann klappt es aber damit nicht:

    float pdx=cx+sin(deg2center+Your_Degrees);  // Destination Y
    float pdy=cy+cos(deg2center+Your_Degrees);  // Destination X
    

    Da fehlt doch noch irgend wie der Radius, sprich der Abstand zwischen Center und Source-Punkt!?



  • Hi,

    war ja im Prinzip auch nur "PseudoCode" ! Natürlich musst du noch die Entfernung ermitteln das war aber nicht dein Anliegen. Genau wie der Radius, ich weiss doch auch nicht wie gross dieser sein soll, es war als Lösungsansatr gedacht für das ermitteln des Winkels zum Center. Alles andere sollte damit realisierbar sein. Zumal es ja als Binary + Futzel Source vorliegt.

    Ansonsten weiss ich auch nicht, also bei mir liefert deg2Center den korrekten Winkel zurück, der Kreis richtet sich zur Maus hin aus und fertsch. Diesen Ermittelten Winkel nimmt man dann einfach und addiert das Gewünschte drauf.
    Das bei der Ausgabe vorher deg mit 115 multipliziert werden muss is mir momentan auch nicht ganz klar allerdings habe ich das Intuitiv so gelöst da ich so auf 360 komm.

    What ever n bisl was selber machen musste schon noch, das was ich dir geben konnte sollte Dir allerdings ersteinmal weiterhelfen.

    float psx=mx; //dot source PX
    float psy=my; //dot source PY
    
    float pdx=0; //dot destination PX
    float pdy=0; //dot destination PY
    
    float cx=300; //center X
    float cy=300; //center y
    
    float deg2center= atan2 ( (psx-cx), (psy-cy ) );
    
     pdx=cx+sin(deg2center)*100;
     pdy=cy+cos(deg2center)*100;
    
     myRC.drawoval (pdx,pdy,10,10);
     myRC.drawoval (300,300,10,10,1);
    
     myRC.drawtext("DEG : "+sl_tools::num2str(deg2center*115),10,80);
    

    mfg. Patrick



  • 1. Koordinatensystem so transformieren dass c im Ursprung liegt
    2. Rotationsmatrix anwenden
    3. Zurückverschieben

    Also

    (x,y) -> (x-cx,y-cy) -> R*(x-cx,y-cy) -> R*(x-cx,y-cy)+(cx,cy)

    wobei R=[[cos(a), sin(a)], [-sin(a), cos(a)]].

    Matrizenmultiplikation kannst du hoffentlich, wenn nicht schaus nach, ist kein Hexenwerk.


Log in to reply