none
OT?: Drehung berechnen RRS feed

  • Frage

  • Hallo,

    ich stehe etwas auf dem Schlauch mit meiner Berechnung beim Drehen. Hier mein Programmcode:

    double dDrehWin = 90.0;	// im Uhrzeigersinn
    double dDrehZentrumX = 0.0;
    double dDrehZentrumY = 0.0;
    double dUNXPunktX = 0.0;
    double dUNXPunktY = 999.0;
    double dDrehWinBm = M_PI * (dDrehWin / 180.0);	// Winkel im Bogenmaß
    double ALPHA = dDrehWinBm;
    double x1 = dDrehZentrumX;
    double y1 = dDrehZentrumY;
    double x2 = dUNXPunktX;
    double y2 = dUNXPunktY;
    double a = sqrt(pow((x1-x2),2)+pow((y1-y2),2));
    double c = a;
    double b = sqrt(pow(a,2)+pow(c,2)-2*a*c*cos(ALPHA));
    double DELTA = 90.0-(180.0-dDrehWin)/2;
    double DELTABm = M_PI * (DELTA / 180.0);	// Winkel im Bogenmaß
    double y = b*sin(DELTABm);
    double x = b*sin((M_PI*(90.0/180.0))-DELTABm);
    TRACE("%f,%f",x,y);

    Als Ergebnis erhalte ich x=999.000000 und y=999.000000.

    Was mache ich beim Berechnen der Variable y falsch?

    Danke im Voraus und viele Grüße

    Bernd

    Mittwoch, 31. August 2016 14:20

Antworten

  • Hallo Bernd

    Sieht so aus, als ob Du mühsam aus den Koordinaten eine Länge und Winkel berechnest, drehst und dann wieder auf Koordinaten zurück rechnest. Das ist aufwändig und fehleranfällig. Schau mal bei Wiki nach:

    https://de.wikipedia.org/wiki/Drehmatrix

    Im Grunde brauchst Du "nur" folgendes machen:

    double x = x1 + (x2 - x1) * cos(dDrehWinBm) - (y2 - y1) * sin(dDrehWinBm);

    double y = y1 + (x2 - x1) * sin(dDrehWinBm) + (y2 - y1) * cos(dDrehWinBm);

    Grüße

    FireHeart

    Mittwoch, 31. August 2016 16:52
  • Hallo FireHeart,

    danke für Deine Antwort.

    Deine Formeln sind mir eine große Hilfe, allerdings musste ich in den Formeln teilweise die Vorzeichen ändern, damit ich das von mir erwarteten Ergebnis erhalte.

    Hier meine aktuellen Formeln:

    double dUNXPunktXDreh = dDrehZentrumX + (dUNXPunktX - dDrehZentrumX) * cos(dDrehWinBm) + (dUNXPunktY - dDrehZentrumY) * sin(dDrehWinBm);
    double dUNXPunktYDreh = dDrehZentrumY - (dUNXPunktX - dDrehZentrumX) * sin(dDrehWinBm) + (dUNXPunktY - dDrehZentrumY) * cos(dDrehWinBm);

    Zum kontrollieren habe ich diese Skizze verwendet:

    Viele Grüße

    Bernd



    Donnerstag, 1. September 2016 06:36

Alle Antworten

  • Hallo Bernd

    Sieht so aus, als ob Du mühsam aus den Koordinaten eine Länge und Winkel berechnest, drehst und dann wieder auf Koordinaten zurück rechnest. Das ist aufwändig und fehleranfällig. Schau mal bei Wiki nach:

    https://de.wikipedia.org/wiki/Drehmatrix

    Im Grunde brauchst Du "nur" folgendes machen:

    double x = x1 + (x2 - x1) * cos(dDrehWinBm) - (y2 - y1) * sin(dDrehWinBm);

    double y = y1 + (x2 - x1) * sin(dDrehWinBm) + (y2 - y1) * cos(dDrehWinBm);

    Grüße

    FireHeart

    Mittwoch, 31. August 2016 16:52
  • Hallo FireHeart,

    danke für Deine Antwort.

    Deine Formeln sind mir eine große Hilfe, allerdings musste ich in den Formeln teilweise die Vorzeichen ändern, damit ich das von mir erwarteten Ergebnis erhalte.

    Hier meine aktuellen Formeln:

    double dUNXPunktXDreh = dDrehZentrumX + (dUNXPunktX - dDrehZentrumX) * cos(dDrehWinBm) + (dUNXPunktY - dDrehZentrumY) * sin(dDrehWinBm);
    double dUNXPunktYDreh = dDrehZentrumY - (dUNXPunktX - dDrehZentrumX) * sin(dDrehWinBm) + (dUNXPunktY - dDrehZentrumY) * cos(dDrehWinBm);

    Zum kontrollieren habe ich diese Skizze verwendet:

    Viele Grüße

    Bernd



    Donnerstag, 1. September 2016 06:36
  • Hallo Bernd,

    Deiner Skizze entnehme ich, dass Du um 60 Grad im Uhrzeigersinn drehst. In der Mathematik (rechtshändiges kartesisches Koordinatensystem) ergibt das jedoch -60° und die Drehung gegen den Uhrzeigersinn um 30 Grad +30° . Da sin(−a) = −sin(a) , so wurde die Matrix transponiert und anstatt Fire-Hearts Formel (die völlig richtig ist) hast Du zweimal die Vorzeichen geändert: (laut dem Wikipedia-Artikel für die Drehung im Uhrzeigersinn, d.h. Deiner Skizze entsprechend, geeignet).

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 2. September 2016 06:05
    Administrator