Benutzer mit den meisten Antworten
OT?: Drehung berechnen

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
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
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 2. September 2016 06:07
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 9. September 2016 12:29
-
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
- Bearbeitet Bernd Föry Donnerstag, 1. September 2016 09:41
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 2. September 2016 06:07
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 9. September 2016 12:29
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
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 2. September 2016 06:07
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 9. September 2016 12:29
-
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
- Bearbeitet Bernd Föry Donnerstag, 1. September 2016 09:41
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 2. September 2016 06:07
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 9. September 2016 12:29
-
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ß,
DimitarBitte 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.