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

Aktuelle Zeit: Mi Mai 15, 2024 04:16

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: VSOP
BeitragVerfasst: Fr Jul 30, 2010 09:55 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Hallo.

Es steht jetzt zur Wahl bei meinem kleinen Sonnensystem, die Planetenbahnen als Ellipse anzunehmen oder einen Schritt weiterzugehen und VSOP zu nehmen - wurde hier im Forum glaube ich mal erwähnt, aber nichts großartig zu gesagt, daher dieses Thema. Die Ellipsenbahn dient natürlich jederzeit als Rückfallmöglichkeit falls es mit der genaueren Variante nicht hinhaut. Es gibt eine Datei die sich bereits darum kümmert. Problem jedoch: Es sind nur die Werte für Erde und Jupiter eingetragen. In der Datei sind ganz einfach Matrizen verwendet worden, welche dann mit den Zahlen dieser Seite befüllt werden müssen. Dies ließe sich für jeden Planeten auch manuell machen und ich wäre bereit mir die Arbeit auch anzutun. Doch gibt es ein kleines Problem: Nehmen wir doch mal folgenden Ausschnitt aus der besagten Codedatei:
Code:
{ 4330    1 }  ( 100013988.799, 0.00000000000,      0.00000000000 ),
{ 4330    2 }  (   1670699.626, 3.09846350771,   6283.07584999140 ),
{ 4330    3 }  (     13956.023, 3.05524609620,  12566.15169998280 ),

Das sind die ersten drei Matrixzeilen der Erde. Die Version ist die 87-4330. Wenn man nun vergleicht mit den offiziellen Werten, stellt man fest, dass die Zahl ganz rechts offensichtlich der Zahl oben in dieser Tabelle ganz rechts entspricht. Doch was ist mit den anderen beiden Zahlen ? Das Hauptproblem ist ganz einfach, dass die Version 4330 nicht kompatibel zur 4310 ist. Also wird es schwierig rauszufinden, was nun welche Spalte ist. Habt Ihr eine Idee wie man das hinkriegen könnte ? Weil wenn man die Spalten wüsste, müsste ich nur einen simplen Algorithmus schreiben, der mir gleich die Textdatei in eine Delphi-Matrix umschreibt, noch einfügen und ich wäre fertig mit allen Planeten. Habe natürlich schon überlegt ob man nicht mit Ellipsen leichter zum Ziel kommt, allerdings kam es mir doch sehr kompliziert vor, den Flächen- und Ellipsensatz von Keppler einzubauen (was ich müsste), denn das dann programmiertechnisch umzusetzen ist denke ich alles andere als leicht. Man müsste den Planeten einfach via glTranslate verschieben, gut, aber dann müsste man unter Berücksichtigung der beiden Gesetze die Koordinaten ausrechnen, auf Basis der allgemeinen Umlaufgeschwindigkeit, Periapsis und Apoapsis. Klingt ja einfach, aber wenn man sich das mal aufmalt und eine Formel, die man in die Renderprozedur klatscht, herleiten will, ist das alles andere als leicht finde ich. Die Physik ist klar, aber nicht der daraus resultierende Algorithmus. Dies aber nur nebensächlich, eigentlich geht es um VSOP - das wäre generell auch interessanter, man könnte dann daraus auch einige relativ exakte Werte wie Sonnenfinsternis etc. berechnen, was mit Ellipsen teilweise ungenau wird. Und so langsam spürt man, dass das Programm doch mehr als ein Anfängersonnensystem wird, aber warum auch nicht.

Gruß,
Nils

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: VSOP
BeitragVerfasst: Fr Jul 30, 2010 10:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Von VSOP hab ich noch nie was gehört, daher kann ich da nicht helfen. Aber die Berechnung nach Kepler ist nicht sooo kompliziert. Das schwierigste ist eigentlich nur die Newton-Iteration zur Lösung der Gleichung. Ich paste hier mal Code aus einer alten Version von UltimateConquest.

Parameter:
Code:
private double meanAnomaly;
private double orbitalPeriod;
private double semiMajorAxis;
private double eccentricity;
private double inclination;
private double longitude;
private double argOfPeriapsis;



meanAnomalyAhead ist die MeanAnomaly für die die Position berechnet werden soll. Ich berechne hier die Position für einen Zeitpunkt in der Zukunft, daher "Ahead".

Code:
double meanAnomalyAhead = meanAnomaly + (timeAhead * TWO_PI / orbitalPeriod);
while (meanAnomalyAhead <  0     ) { meanAnomalyAhead += TWO_PI; }
while (meanAnomalyAhead >= TWO_PI) { meanAnomalyAhead -= TWO_PI; }

// compute planet position based on orbit parameters
// http://en.wikipedia.org/wiki/Mean_anomaly
// http://en.wikipedia.org/wiki/True_anomaly
// http://en.wikipedia.org/wiki/Orbital_elements

// solving using newton iteration:
// eccentricAnomaly - eccentricity*sin(eccentricAnomaly) - meanAnomaly = 0
double eccentricAnomaly = meanAnomalyAhead;
for (int i=0; i<3; ++i) {
   eccentricAnomaly -= (eccentricAnomaly - eccentricity*Math.sin(eccentricAnomaly) - meanAnomalyAhead)
                     / (1 - eccentricity*Math.cos(eccentricAnomaly));
}
double radius = semiMajorAxis * (1 - eccentricity * Math.cos(eccentricAnomaly));
double trueAnomaly = 2 * Math.atan2(
   Math.sqrt(1 + eccentricity) * Math.sin(eccentricAnomaly / 2.0),
   Math.sqrt(1 - eccentricity) * Math.cos(eccentricAnomaly / 2.0)
);
double angle = trueAnomaly + argOfPeriapsis;
result = new Vector3d( Math.sin(angle)*radius, 0, Math.cos(angle)*radius);
result = Matrix33d.rotationY(longitude).transform(result);
result = Matrix33d.rotationZ(inclination).transform(result);


Result ist dann die Position.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: VSOP
BeitragVerfasst: Fr Jul 30, 2010 21:03 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Hi,

habe mich da jetzt nochmal richtig reingearbeitet, erstmal vielen Dank für die Links im Code vor allem und natürlich den Code selbst, wobei die Links glaube ich wesentlich wichtiger waren. Denn so detailliert wie in der englischen Wikipedia steht es in meinem Physik-Hefter dann doch nicht (und noch weniger steht in der deutschen Wikipedia, ich steige jetzt endgültig auf die Englische um). Ein paar kleine Fragen habe ich leider aber doch noch, ein paar Variablen sind mir nicht ganz klar geworden: Was genau setzt man für meanAnomaly denn überhaupt ein ? Ist das eine abstrakte Zahl oder hat die eine Einheit ? orbitalPeriod wird die siderische Umlaufzeit sein nehme ich an. Aber was ich überhaupt nicht verwerten konnte: argOfPeriapsis. Soll das den Winkel zwischen Periapsis und Apoapsis darstellen oder was ist das ? Mit meinen derzeitigen Werten steht der Merkur noch still, vermutlich läuft dann irgendetwas wegen den falschen Zahlen schief, die ich testweise eingesetzt habe. Und die letzte Frage: Was genau machen die beiden letzten Zeilen ? Ich konnte den Code gut übersetzen, aber an dem Punkt steige ich durch die Syntax nicht mehr durch. Ist das vergleichbar mit einem glTranslate(...) in Delphi und wäre das dann quasi die Verschiebung und gleichzeitig Rotation des Planeten um seine Ellipsenbahn ?

Gruß,
Nils

_________________
Meine Musik: spiker-music.net


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: VSOP
BeitragVerfasst: Fr Jul 30, 2010 21:44 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
meanAnomaly (...) Ist das eine abstrakte Zahl oder hat die eine Einheit ?

Eine Art Winkel. Wäre der Orbit ein Kreis entspräche die meanAnomaly genau der aktuellen Winkelposition. Der Witz ist halt das du die meanAnomaly linear behandeln kannst, also einfach einen "Winkel" pro Zeit drauf addieren. Bei einem elliptischen Orbit ist die Winkelgeschwindigkeit ja nicht immer gleich.

Zitat:
orbitalPeriod wird die siderische Umlaufzeit sein nehme ich an.

Das ist einfach die Dauer eines Umlaufs in der Zeiteinheit die du halt verwenden möchtest. Letzlich ein Skalierungsfaktor für die Geschwindigkeit.

Zitat:
Aber was ich überhaupt nicht verwerten konnte: argOfPeriapsis.

Schau dir das Bild in der Wikipedia an. Da ist es eingezeichnet als "Argument of Periapsis". Einfach ein Winkel der auf die "True anomaly" addiert wird damit du den Nullpunkt festlegen kannst.

Zitat:
Und die letzte Frage: Was genau machen die beiden letzten Zeilen ?

Matrix33d.rotationY erzeugt eine Rotationsmatrix die um den angegebenen Winkel um die Y-Achse dreht. roationZ ist analog für die Z-Achse. Matrix33d.transform wendet die Matrix auf den Punkt an. Hier wird also einfach nur der Punkt erst um den Winkel longitude auf der Y-Achse gedreht und dann um den Winkel inclination auf der Z-Achse. Das ganze entspricht quasi einem zweimaligen glRotate. Wenn du den Code dafür haben willst schau dir die Klasse Matrix33d von WGT an. Der Quellcode findet sich im UltimateConquest-Thread.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: VSOP
BeitragVerfasst: Do Aug 12, 2010 09:33 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 03, 2007 14:22
Beiträge: 388
Da hier im Mathematik-Forum nicht so viel los ist und es dann nicht ganz so schlimm ist wenn ein etwas älteres Thema nochmal kurz um zwei Plätze hochkommt, möchte ich hier natürlich noch Dankeschön sagen :), die Ellipsenberechnung funktioniert sehr gut und mit den guten Erklärungen war alles auch schön nachvollziehbar.

_________________
Meine Musik: spiker-music.net


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 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.027s | 17 Queries | GZIP : On ]