[Mathe] Anhand von Kreiskoordinaten Winkel errechnen

Design Patterns, Erklärungen zu Algorithmen, Optimierung, Softwarearchitektur
Forumsregeln
Wenn das Problem mit einer Programmiersprache direkt zusammenhängt, bitte HIER posten.
Antworten
Eisflamme
Establishment
Beiträge: 412
Registriert: 26.05.2002, 17:42
Wohnort: Köln

[Mathe] Anhand von Kreiskoordinaten Winkel errechnen

Beitrag 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!
gdsWizard
Establishment
Beiträge: 237
Registriert: 04.02.2005, 09:12
Benutzertext: www.gamedevstudio.com
Echter Name: Thomas Mittelsdorf
Wohnort: Meiningen
Kontaktdaten:

Re: [Mathe] Anhand von Kreiskoordinaten Winkel errechnen

Beitrag von gdsWizard »

Ich glaube du suchst die Funktion atan2(); Sie macht die Fallunterscheidung direkt.

Gruss gdsWizard
Eisflamme
Establishment
Beiträge: 412
Registriert: 26.05.2002, 17:42
Wohnort: Köln

Re: [Mathe] Anhand von Kreiskoordinaten Winkel errechnen

Beitrag von Eisflamme »

Cool, danke. :)
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [Mathe] Anhand von Kreiskoordinaten Winkel errechnen

Beitrag 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.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Eisflamme
Establishment
Beiträge: 412
Registriert: 26.05.2002, 17:42
Wohnort: Köln

Re: [Mathe] Anhand von Kreiskoordinaten Winkel errechnen

Beitrag 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. :)
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [Mathe] Anhand von Kreiskoordinaten Winkel errechnen

Beitrag 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). ;-)
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Eisflamme
Establishment
Beiträge: 412
Registriert: 26.05.2002, 17:42
Wohnort: Köln

Re: [Mathe] Anhand von Kreiskoordinaten Winkel errechnen

Beitrag von Eisflamme »

Stimmt. Sehr gut!
Antworten