Seite 1 von 1

[Mathe] Anhand von Kreiskoordinaten Winkel errechnen

Verfasst: 27.02.2011, 14:19
von Eisflamme
Hi,

Habe gerade ein Problem. Ich habe zwar auch eine Lösung, möchte aber wissen, ob es nicht einfacher geht.

Problem:
Ich habe eine Kugel, welche zum Ursprung einen gewissen Abstand hat. Nun möchte ich diese Kugel auf der y-Achse rotieren und zwar weiter rotieren, d.h. gemäß ihrer aktueller Position würde 0° Rotation nichts bewirken.

Idee
Um die Kugel weiter zu rotieren, brauche ich natürlich den Abstand zur y-Achse, also d = sqrt(dx^2 + dz^2), mit dx = Abstand auf x-Achse und dz = Abstand auf z-Achse. Nächster Schritt ist, dass ich den Winkel rausfinde, zu dem die Kugel gerade bereits rotiert ist. Das benötige ich, da ich vor hatte, die neue Position durch: x = sin(rotationswinkel) * abstand, z = cos(rotationswinkel) * abstand (y-Achse ist nicht verschoben) rauskriege.

Frage:
Kann ich das auch ohne Neuberechnung der Position machen, indem ich irgendetwas hinzuaddiere? Ist das besser?

Weiterführung Idee:
Ich hab erstmal angenommen (da ich kA hab), dass ich die Position neu berechnen muss und daher eben den Winkel rausfinden muss. Jetzt habe ich mit asin und acos rumgespielt. Resultat sind zwei Winkel, ich möchte aber einen haben, wobei 90° eine viertel Rotation, 180° eine halbe Rotation, 270° eine 3/4 Rotation etc. sind. Jetzt habe ich folgende Wertepaare rausgefunden:

Code: Alles auswählen

(a,b) -> rotationswinkel
mit a = asin(dx), b = acos(dz)

(0, 0) -> 0°
(180, 180) -> 90°
(0, 360) -> 180°
(-180, 180) -> 270°
Frage:
Wie kann ich das (f(dx,dz) -> rotationswinkel) in eine Formel packen ohne Fallunterscheidung machen zu müssen? Oder muss ich ne Fallunterscheidung machen? Mir kommt es vor, als ginge das besser.

Danke schon Mal!

Re: [Mathe] Anhand von Kreiskoordinaten Winkel errechnen

Verfasst: 27.02.2011, 20:07
von gdsWizard
Ich glaube du suchst die Funktion atan2(); Sie macht die Fallunterscheidung direkt.

Gruss gdsWizard

Re: [Mathe] Anhand von Kreiskoordinaten Winkel errechnen

Verfasst: 27.02.2011, 21:10
von Eisflamme
Cool, danke. :)

Re: [Mathe] Anhand von Kreiskoordinaten Winkel errechnen

Verfasst: 28.02.2011, 18:37
von CodingCat
Das hört sich doch nach einer ganz simplen Drehung des Kugelmittelpunktes um den Ursprung bzw. die y-Achse an. Selbstverständlich geht das, ohne erst aufwändig "den" Winkel des Punktes zu bestimmen, sonst wäre Rotation von Punktwolken bzw. 3D-Modellen ja eine technische Katastrophe. Simple Herleitung:

Du konstruierst dir 3 gedrehte Basisvektoren, am besten b_1 = ( cos(w), 0, sin(w) ), b_2 = ( 0, 1, 0 ), b_3 = ( -sin(w), 0, cos(w) ) (die Vektoren bilden eine Orthonormalbasis; b_1, b_3 liegen auf dem Einheitskreis in der X-Z-Ebene). Dann baust du daraus eine Transformationsmatrix und transformierst den Kugelmittelpunkt damit bzw. rechnest für das Kugelzentrum c: c' = x_c * b_1 + y_c * b_2 + z_c * b_3, schwupps ist die Kugel um die Y-Achse um den Winkel w gedreht. Beachte, dass b_1 und b_3 jeweils denselben Sinus bzw. Cosinus berechnen, das solltest du in deinem Programm natürlich vorher cachen. So kommst du auf nur 2 Aufrufe trigonometrischer Funktionen und musst nicht aufwändig mit irgendwelchen Winkeln rumrechnen.

Re: [Mathe] Anhand von Kreiskoordinaten Winkel errechnen

Verfasst: 28.02.2011, 19:09
von Eisflamme
Hi,

Mein Aktueller Code braucht eine Wurzel, einen Sinus, einen Cosinus und einen zwei-parametrigen Arcustangens.

Deine Variante ist in der Tat etwas einfacher, auch wenn ich einige Multiplikationen mehr habe, aber die kosten ja nix. Thx. :)

Re: [Mathe] Anhand von Kreiskoordinaten Winkel errechnen

Verfasst: 28.02.2011, 19:35
von CodingCat
Angesichts der vielen Nullen in den Beispielbasisvektoren kannst du mittels Ausmultiplizieren selbst die Multiplikationen ziemlich drastisch reduzieren (ich komme auf 4 Multiplikationen und 2 Additionen). ;-)

Re: [Mathe] Anhand von Kreiskoordinaten Winkel errechnen

Verfasst: 28.02.2011, 20:07
von Eisflamme
Stimmt. Sehr gut!