2017-11-24 20 views
0

Ich versuche, einen Punkt um den Ursprung zu drehen, und ich habe andere Möglichkeiten gesehen, dies zu tun, aber ich verstehe immer noch nicht, warum mein ursprünglicher Code nicht richtig funktioniert. Hier ist der ursprüngliche Algorithmus, den ich konstruiert habe.Drehen eines Punktes mit Math.Asin()

 decimal[] values = new decimal[] {5.6, 2.4, 8.7}; 
     decimal hypotenuse = (decimal)Math.Sqrt((double)(values[0] * values[0]) + (double)(values[1] * values[1]) + (double)(values[2] * values[2])); 
     decimal x = values[0]/hypotenuse; 
     decimal y = values[1]/hypotenuse; 
     decimal z = values[2]/hypotenuse; 
     decimal checkerhypotenuse = (decimal)Math.Sqrt((double)(x * x) + (double)(y * y) + (double)(z * z)); 
     values[0] = (decimal)Math.Sin(Math.Asin((double)x) + (double)RotationX) * hypotenuse; 
     values[1] = (decimal)Math.Cos(Math.Acos((double)y) + (double)RotationX) * hypotenuse; 

Werte ist eine Sammlung von x, y und z-Koordinaten für meine Punkte. und anstatt Ergebnisse zurückzugeben, rotiert es nicht richtig. RotationX ist die Menge im Bogenmaß, um die sich die Rotation um den Ursprung ändern sollte.

Das Konzept davon ist, wenn Sin (Arcsin (Theta)) = Theta, dann Sin (Arcsin (Theta) + zusätzliche Grade der Rotation) Checkerhypotenuse sollte immer gleich 1, und es scheint zu.

Antwort

0

Sie Ansatz (korrigiert) können in 2D-Fall arbeiten:

cx = values[0]/hypotenuse; 
    cy = values[1]/hypotenuse; 

    values[0] = (decimal)Math.Cos(Math.ACos((double)x) + (double)RotationX) * hypotenuse; 
    values[1] = (decimal)Math.Sin(Math.ASin((double)y) + (double)RotationX) * hypotenuse; 

Aber in 3D Fall Ihre x, y, z sind direction cosines und Math.ACos((double)x)nicht geben rechten Winkel in OXY-Ebene.

Zum Beispiel:

values[0] = values[1] = values[2] = 1 

Definitiv Projektion des Punktes auf OXY Ebene liegt unter einem Winkel 45. Aber Richtungskosinusmatrix ist 1/Sqrt(3), nicht 1/Sqrt(2), so Drehung um -45 mit Formel nicht Null Koordinate liefert.

Verwandte Themen