Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 11, 2025 03:39

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Jan 15, 2007 14:34 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

ich hab ein kleines problem beim umrechnen von Kugelkoordinaten und Kartesischen Koordinaten.

Auf Wikipedia gibt es ja eine eigentlich ziemlich eindeutige formel:
http://de.wikipedia.org/wiki/Kugelkoordinaten

Allerdings, wenn ich die direkt so benutze, und dann eine Kugelkoordinate -> Kartesische Koordinate -> Kugelkoordinate umrechne, ist das endergebnis oft anders als die ursprünglichen koordinaten.. (manchmal nur z.B. -11 statt 349, manchmal aber auch was komplett verkehrtes)

Code:
  1. function SphereCoordinateToVector(X, Y: Single): TVertex;
  2. begin
  3.   X:=X * PIdiv180;
  4.   Y:=Y * PIdiv180;
  5.   Result.X:=sin(X) * cos(Y);
  6.   Result.Y:=sin(X) * sin(Y);
  7.   Result.Z:=cos(X);
  8. end;
  9.  
  10. function VectorToSphereCoordinate(V: TVertex; ConverToDeg: Boolean = true): TVector2D;
  11. var
  12.   sRoot: Single;
  13. begin
  14.   sRoot:=Sqrt(Sqr(V.X) + Sqr(V.Y));
  15.   if sRoot = 0 then
  16.     sRoot:=0.000000001;
  17.   if V.Y >= 0 then
  18.     Result.Y:=Arccos(V.X / sRoot)
  19.   else
  20.     Result.Y:=PImul2 - Arccos(V.X / sRoot);
  21.   Result.X:=PIdiv2 - ArcTan(V.Z / sRoot);
  22.   if ConverToDeg then begin
  23.     Result.X:=Result.X * AngdivPI;
  24.     Result.Y:=Result.Y * AngdivPI;
  25.   end;
  26. end;



Wenn man nun hier:
Code:
  1.     X:=[..];
  2.     Y:=[..];
  3.     V:=SphereCoordinateToVector(X, Y);
  4.     K:=VectorToSphereCoordinate(V);


für X = 257 und Y = 125 einsetzt, kommt bei K raus: X = 103, Y = 305.
Also wäre X eigentlich X = 360 - K.X und Y = Y - 180.

Und da gibt es ganz viele fälle... weiß jemand wie da die regel ist? So vonwegen If X > 0 then...

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 15, 2007 15:28 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Tja das liegt daran, dass die Koordinaten in Rad von -Pi bis +Pi gehen (also -180° bis +180°), bei Dir von 0 bis 2Pi. -11 entspricht gradmäßig der 349, auch die anderen Koordinaten sind korrekt (257+103=360). Du musst also hinterher noch 'normieren'. Du musst also entscheiden, in welchem Quadrant die ursprüngliche Koordinate liegt und dann 360 addieren/subrtrahieren, bis es passt.

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jan 15, 2007 23:41 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Sidorion hat geschrieben:
Tja das liegt daran, dass die Koordinaten in Rad von -Pi bis +Pi gehen (also -180° bis +180°), bei Dir von 0 bis 2Pi. -11 entspricht gradmäßig der 349, auch die anderen Koordinaten sind korrekt (257+103=360). Du musst also hinterher noch 'normieren'. Du musst also entscheiden, in welchem Quadrant die ursprüngliche Koordinate liegt und dann 360 addieren/subrtrahieren, bis es passt.

Jep, genau... nur, das "bis es passt" ist das was noch probleme macht... ich hab bisher nich wirklich ne regel gefunden nach der ich was addieren/subtrahieren muß.. immer wenn ich dachte ich hab es, kam wieder nen fall wo es nich zutraf etc.. :(

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Jan 16, 2007 00:27 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
Aya hat geschrieben:
für X = 257 und Y = 125 einsetzt, kommt bei K raus: X = 103, Y = 305.
Also wäre X eigentlich X = 360 - K.X und Y = Y - 180.


Wenn ich das richtig sehe, ist X bei dir der
Zitat:
θ (Polarwinkel) ist der Winkel zwischen der positiven z-Achse und r, gezählt von 0 bis π (0° bis 180°)

Eigentlich normiert deine Funktion also (zumindest bei diesem Beispiel) nur den Wert, weil ein Polarwinkel > 180° führt zu einer Operation, die auch mit 360° minus Polarwinkel als Polarwinkel (praktisch eine Spiegelung des Polarwinkels θ an der Y-Achse) und dafür einer größeren Drehung um die Y-Achse mit dem Azimutwinkel durchgeführt werden könnte. Dabei muss der Azimutwinkel φ dann natürlich eine 180°-Drehung vollführen. Wenn er dann größer als 360° ist, muss man diese wieder von ihm subtrahieren, um ihn ins Intervall [0°..360°) zu bekommen und es entsteht die Formel Y = Y + 180° - 360° = Y - 180°.
Dh. eigentlich beschreiben Eingabe und Ausgabe den gleichen Punkt, nur die Ausgabe ist konform zur Aussage in WP, dass der Polarwinkel auf [0°..180°) definiert ist. Folglich würde es wahrscheinlich Sinn machen, alle Koordinaten vor Verwendung einmal durchlaufen zu lassen, um sie so zu normieren.

Hoffe, dass war nicht ganz unverständlich und ein bisschen hilfreich ;)

MfG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 16, 2007 00:39 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

mhh... aber wenn ich z.B. 305, statt 125 bekomme, ist es zwar nur um 180° verdreht, zeigt aber dadurch nicht auf den selben punkt der kugel, sondern doch genau auf den auf der gegenüberliegenden seite..
Ich hab es eben auch mal probiert die werte erst einmal durchzujagen um sie zu normieren, aber selbst dann gab es noch unterschiede (z.B. bei X = 180, Y = 36 wurde zu X = 180, Y = 216 -> 180 verschoben).

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 16, 2007 00:56 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 02, 2002 15:41
Beiträge: 867
Wohnort: nahe Stuttgart
Aya hat geschrieben:
mhh... aber wenn ich z.B. 305, statt 125 bekomme, ist es zwar nur um 180° verdreht, zeigt aber dadurch nicht auf den selben punkt der kugel, sondern doch genau auf den auf der gegenüberliegenden seite..

Du musst überlegen, dass ja nicht nur der Azimutwinkel sich verändert hat, sondern auch der Polarwinkel. und du kannst mit einem Polarwinkel 0 bis 180° alle Kugelkoordinaten darstellen, wenn der Azimutwinkel 0 bis 360° umfasst.
Hier ist der Polarwinkel die Drehung um die Z-Achse. Wenn du dir mal vorstellst, dass du 360° um Y rotieren kannst, siehst du vielleicht, dass dir 180° um Z langt, um alle Punkte beschreiben zu können.

Zitat:
Ich hab es eben auch mal probiert die werte erst einmal durchzujagen um sie zu normieren, aber selbst dann gab es noch unterschiede (z.B. bei X = 180, Y = 36 wurde zu X = 180, Y = 216 -> 180 verschoben).

Das sieht auf den ersten Blick natürlich unlogisch aus, ist aber genau was ich gesagt habe, wenn die 180° beim Ergebnis in Wirklichkeit 0° sind. Das Problem hier ist, dass der Polareingabewinkel θ auch nicht auf [0..180°] definiert ist, sondern auf [0..180°), sprich die 180° sind nicht mehr in der Definitionsmenge.

Mal generell gesagt, müssten daher alle Kugelkoordinaten so normiert werden (egal ob manuell oder durch die Transformationen):
Code:
  1. if Eingabe.X >= 180 then // liegt außerhalb der Definition
  2. begin
  3.   Eingabe.X = 360-Eingabe.X;  // spiegelt den Polarwinkel an 360°=0°
  4.   Eingabe.Y := Eingabe.Y+180; // dreht den Azimutwinkel passend dazu
  5.   if Eingabe.Y > 360 then     // falls er die Definitionsmenge verlässt
  6.     Eingabe.Y := Eingabe.Y-360; // holen wir ihn "zurück"
  7. end;


MfG


Zuletzt geändert von WhiteHunter am Di Jan 16, 2007 16:16, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 16, 2007 00:59 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Wah stimmt, du hast recht... der eine wert muß ja nur von 0..180 gehen, war nen totaler denkfehler von mir :)
Jetzt geht es auch... Daanke ^^

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Jan 16, 2007 11:02 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
man könnte auch die arccos2 aus math verwenden, die rechnet y,x koords in einen winkel um (richtiger Quadrant). Also Polar->Karth, kann aber auch bei der implementierung von Kugelkoords praktisch sein. Achtung y muss <>0 sein, und die Paramreihenfolge war afair y,x


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] und 6 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 17 Queries | GZIP : On ]