Grafik€ prosvomo—wsvh planhtik‚n troqi‚nusers.auth.gr/~voyatzis/SeniorThesis/pLiggas.pdf ·...
Transcript of Grafik€ prosvomo—wsvh planhtik‚n troqi‚nusers.auth.gr/~voyatzis/SeniorThesis/pLiggas.pdf ·...
Γραφική προσvομοίωσvη πλανητικών τροχιών
Λίγγας Ραφαήλ Α.Ε.Μ : 13731
Επιβλέπων καθηγητής: Δρ. Γ. Βουγιατζής
Τμήμα Φυσvικής , Σχολή θετικών επισvτημών,
Αρισvτοτέλειο πανεπισvτήμιο Θεσvσvαλονίκης
Ιούνιος 2017
1
2
Περίληψη
Σκοπός της εργασvίας αυτής είναι η κατασvκευή κώδικα με τη χρήσvη
OpenGL που θα αναπαρισvτάνει τις τροχιές πλανητών ή άλλων σvωμάτωνσvτον τρισvδιάσvτατο χώρο λαμβάνοντας υπόψιν το πρόβλημα των Ν-σvωμάτων. Η ολοκλήρωσvη των διαφορικών εξισvώσvεων του σvυσvτή-ματος γίνεται με σvυμπλεκτικό ολοκληρωτή 6ης τάξης. Οι αρχικέςσvυνθήκες των πλανητών ορίζονται με τη χρήσvη των Κεπλεριανών τρο-
χιακών σvτοιχείων τους. Στο πρόγραμμα αναπαρισvτώνται το ηλιακόμας σvύσvτημα, τρία εξωπλανητικά σvυσvτήματα (τα σvτοιχεία των οποίωνπάρθηκαν από τις ασvτρονομικές βάσvεις δεδομένων openexoplanetcat-alogue.com και exoplanet.eu) και ένα παράδειγμα ασvταθούς σvυσvτή-ματος. Ο χρήσvτης μπορεί να εισvάγει το δικό του πλανητικό σvύσvτημακατασvκευάζοντας ένα ASCII αρχείο αρχικών σvυνθηκών και κάνονταςκάποιες μικρές αλλαγές σvτον κώδικα όπως περιγράφεται σvτην εργασvία.
AbstractThe purpose of this project is the construction of a C-code us-
ing OpenGL that depicts the motion of planets or other bodies inthree dimensional space taking into account the N-body gravita-tional problem. The integration of the system's dierential equa-tions is being done with a 6th order symplectic integrator. Theinitial conditions of the planets are dened through the use of theirorbital elements. The program depicts our solar system , three exo-planet systems ( the details of which were taken from the astonom-ical databases openexoplanetcatalogue.com and exoplanet.eu) andone unstable system. The user can insert his/her own planetarysystem by constructing an ASCII le with the initial conditions andmaking slight changes in the code as it is described in the project.
3
Contents
1 Εισvαγωγή. 5
1.1 Το ηλιακό σvύσvτημα. . . . . . . . . . . . . . . . . . . . 51.2 Εξωπλανητικά σvυσvτήματα. . . . . . . . . . . . . . . . 61.3 Τροχιές πλανητών. . . . . . . . . . . . . . . . . . . . 61.4 OpenGL. . . . . . . . . . . . . . . . . . . . . . . . . . 8
2 Πρόβλημα των Ν-σvωμάτων. 9
2.1 Τα 10 ολοκληρώματα της κίνησvης. . . . . . . . . . . . 102.2 Οι εξισvώσvεις της κίνησvης. . . . . . . . . . . . . . . . . 142.3 Αριθμητική ολοκλήρωσvη με τη σvυμπλεκτική μέθοδο. . . 142.4 Μετατροπή τροχιακών σvτοιχείων σvε καρτεσvιανό
σvύσvτημα σvυντεταγμένων. . . . . . . . . . . . . . . . . 16
3 Το πρόγραμμα. 18
3.1 Αρχικές σvυνθήκες. . . . . . . . . . . . . . . . . . . . 193.2 Περί του προγράμματος. . . . . . . . . . . . . . . . . . 203.3 Η βασvική σvυνάρτησvη. . . . . . . . . . . . . . . . . . . 233.4 Αλληλεπίδρασvη με το πρόγραμμα. . . . . . . . . . . . . 283.5 main.cpp . . . . . . . . . . . . . . . . . . . . . . . . . 30
4
1 Εισvαγωγή.
1.1 Το ηλιακό σvύσvτημα.
Χιλιάδες χρόνια πριν, οι αρχαίοι ανεπτυγμένοι πολιτισvμοί προσvπαθούσ-vαν να εξηγήσvουν με ορθολογισvτικό τρόπο τη κίνησvη των ουράνιων
σvωμάτων προτείνοντας διάφορα μοντέλα για την ερμηνεία τους.Ο Αρίσvταρχος ο Σάμιος (310-230 π.Χ.) ήταν ο πρώτος ασvτρονόμος
που υποσvτηριξε το ηλιοκεντρικό μοντέλο. Ισvχυρίσvτηκε ότι ο ΄Ηλιοςκαι όλοι οι ασvτέρες παραμένουν διαρκώς ακίνητοι ενώ η Γη, την οποίατοποθέτησvε σvωσvτά ως τον τρίτο πλανήτη από τον ΄Ηλιο, κάνει τόσvο μιαετήσvια περισvτροφή γύρω από αυτόν όσvο και μια ημερήσvια περισvτροφή
περί τον άξονά της.Κατά την αναγέννησvη ο Nicolaus Copernicus (1473-1543) το 1543
δημοσvίευσvε το έργο με τίτλο De Revolutionibus Orbium Celestium(Περί της περισvτροφής των Ουράνιων Σφαιρών) σvυνεχίζοντας τη θεω-ρία του ηλιοκεντρικού σvυσvτήματος. Στο μοντέλο αυτό ο ΄Ηλιος κατέχειτο κέντρο του σvυσvτήμα- τος ως ακλόνητο σvώμα, η Γη περισvτρέφεταιγύρω από τον άξονα της και περιφέρεται γύρω απο τον ΄Ηλιο, όπωςκαι οι υπόλοιποι πλανήτες, αλλά με κυκλικές τροχιές.Ο Johannes Kepler (15711630 ) από παρατηρήσvεις ουράνιων
σvωμάτων διατύπωσvε τους τρεις νόμους που προσvδιορίζουν την κίνησvη
των πλανητών. Στο μοντέλο αυτό οι τροχιές των πλανητών είναιελλειπτικές και όχι κυκλικές, με τη μία εσvτία της έλλειψης να τηκατέχει ο ΄Ηλιος (1 oς νόμος). Το 1609 δημοσvίευσvε το έργο As-tronomia Nova σvτο οποίο διατυπώνει τους δύο πρώτους νόμους, ενώτο 1619 δημοσvιεύει το Harmonices Mundi σvτο οποίο διατυπώνει τοντρίτο νόμο.Το 1687 ο Sir Isaac Newton (1643-1727) δημοσvίευσvε το έργο του
Philosophiae Naturalis Principia Mathematica, σvτο οποίο διατυπώνειτους 3 νόμους, και βασvιζόμενος σvτους νόμους του Kepler διατύπωσvετο νόμο της παγκόσvμιας έλξης, με τον οποίο ερμήνευσvε την κίνησvη τωνπλανητών. Η κίνησvή τους περιγράφεται ως το αποτέλεσvμα της βαρυ-τικής δύναμης η οποία είναι αντισvτρόφως ανάλογη του τετραγώνου της
απόσvτασvης, και ανάλογη του γινομένου των μαζών τους.
5
1.2 Εξωπλανητικά σvυσvτήματα.
Εξωηλιακός πλανήτης ή εξωπλανήτης ονομάζεται κάθε πλανήτης που
δεν ανήκει σvτο δικό μας Ηλιακό Σύσvτημα. Ο πρώτος εξωπλανήτηςβρέθηκε το 1988 και επιβεβαιώθηκε το 1992. Από τότε έχουν βρε-θεί (μέχρι τον Ιούνιο του 2017) 3610 εξωπλανήτες σvε 2704 εξωπλαν-ητικά σvυσvτήματα. Πληροφορίες για αυτά τα σvυσvτήματα υπάρχουν σvτιςασvτρονομικές βάσvεις δεδομένων: exoplanet.eu και openexoplanetcat-alogue.com .
1.3 Τροχιές πλανητών.
Στην εργασvία αυτή το σvύσvτημα αναφοράς είναι το εκάσvτοτε ασvτέρι του
σvυσvτήματος που αναπαρισvτάται.Για να περιγραφεί μια σvυγκεκριμένη και μοναδική τροχιά χρειάζον-
ται 6 χαρακτηρισvτικά που λέγονται Κεπλέρια σvτοιχεία.
6
Τα δύο κύρια σvτοιχεία που ορίζουν το σvχήμα και το μέγεθος της
τροχιάς.1)Μεγάλος ημιάξονας (semimajor axis α) : Το ήμισvυ του
μήκους του κύριου άξονα της έλλειψης.2)Εκκεντρότητα (eccentricity e): προσvδιορίζει τη μορφή της
έλλειψης. Είναι ένα μέτρο που προσvδιορίζει πόσvο η κωνική τομήαπέχει από το να είναι τέλειος κύκλος.Τα επόμενα δύο σvτοιχεία καθορίζουν τον προσvανατολισvμό του τρο-
χιακού επιπέδου.3)Κλίσvη (inclination i) : Η γωνία μεταξύ του επιπέδου που
ορίζει η τροχιά σvε σvχέσvη με το επίπεδο αναφοράς.4)Μήκος αναβιβάζοντος σvυνδέσvμου (Longtitude of theascending node Ω) : είναι η γωνία, που βρίσvκεται σvτο επίπεδο
αναφοράς, και προσvδιορίζει το προσvανα- τολισvμό του αναβιβάζοντοςσvυνδέσvμου της έλλειψης ως προς τη κατεύθυνσvη αναφοράς.
5)Το όρισvμα (γωνία) του περικέντρου (Argument ofpericenter ω) : είναι η γωνία, η οποία ορίζεται πάνω σvτο επίπεδο
της τροχιάς και ορίζεται ανάμεσvα σvτο περίκεντρο της τροχιάς και τον
αναβιβάζοντα σvύνδεσvμο με φορά τη διεύθυνσvη της κίνησvης.6)Αληθής Ανωμαλία, (True Anomaly v) : Η πραγματική
γωνία που υποδεικνύει την ακριβή θέσvη του σvώματος σvτην τροχιά
μετά από το τελευταίο πέρασvμά του από το περίκεντρο.΄Ενα ακόμα σvτοιχείο που χρειάζεται σvτην σvυγκεκριμένη εργασvία εί-
ναι η Μέσvη Ανωμαλία (Mean Anomaly M) : είναι η γωνίακατά την οποία θα είχε κινηθεί το δευτερεύον σvώμα από τη χρονική
σvτιγμή της τελευταίας του διέλευσvης από το περίκεντρο, υποθέτον-τας ότι θα κινούνταν με σvταθερή ταχύτητα σvε μία κυκλική τροχιά με
περίοδο ίσvη με αυτήν της πραγματικής ελλειπτικής του τροχιάς. Ορίζε-ται σvτις 0 μοίρες σvτο περίκεντρο και σvτις 180 μοίρες σvτο απόκεντρο.Η μέσvη ανωμαλία σvυνηθίζεται να χρησvιμοποιείται ως το 6Κεπλέριοσvτοιχείο αντί της αληθούς ανωμαλίας.
7
1.4 OpenGL.
Η Open Graphics Library (OpenGL) είναι η καθιερωμένη ΔιεπαφήΠρογραμματισvμού Εφαρμογών(Application programming interface,API) για την απόδοσvη 2D και 3D Γραφικών. Είναι ανεξάρτητη λει-τουργικού σvυσvτήματος και σvυνήθως αλληλεπιδρά με την κάρτα γραφικών
ώσvτε να πετύχει ταχύτερη απόδοσvη γραφικών. Χρησvιμοποιείται εκ-τενώς σvτα εργαλεία σvχεδίασvης μέσvω υπολογισvτή, σvτα βιντεοπαιχνίδια,σvτην εικονική και επαυξημένη πραγματικότητα, σvε εξομοιωτές πτήσvης,σvτις επισvτημονικές οπτικοποιήσvεις και έχει έναν μεγάλο αριθμό ενσvω-
ματωμένων δυνατοτήτων. Η OpenGL είναι ορισvμένη ως ένα σvύνολομεθόδων (ρουτίνων) και ένα σvύνολο ακεραίων σvταθερών που μπορούννα κληθούν ώσvτε να αποδοθούν τα γραφικά. Αν και οι ορισvμοί τωνμεθόδων είναι παρόμοιοι με αυτούς της γλώσvσvας προγραμματισvμού C,είναι ανεξάρτητοι γλώσvσvας, το οποίο επιτρέπει την χρήσvη των μεθόδωναυτών από διάφορες γλώσvσvες προγραμματισvμού.Η OpenGL αναπτύχθηκε το 1991 από την Silicon Graphics (SGI)
και πλέον αναπτύσvσvεται από την μη-κερδοσvκοπική κοινοπραξίαKhronosGroup.Στο πρόγραμμα χρησvιμοποιείται η GLUT (graphics library utility
toolkit) που είναι ένα εργαλείο για την κατασvκευή κώδικα OpenGL.Η GLUT κάνει πολύ πιο εύκολη την χρήσvη και την εξερεύνησvη τωνOpenGL προγραμμάτων και παρέχει ενα φορητόAPI για την κατασvκευήOpenGL προγραμμάτων που λειτουργούν σvε ολά τα λειτουργικά σvυσvτή-ματα.Ο κώδικας κατασvκευάσvτηκε σvτοVisual Studio που είναι το περιβάλ-
λον ανάπτυξης (IDE) της Microsoft.Τα αρχεία που χρησvιμοποιήθηκαν είναι: glut32.lib, glu32.lib,
glut32.dll, glut.h .
8
2 Πρόβλημα των Ν-σvωμάτων.
Με την ανακάλυψη του Νεύτωνα έγινε η πρώτη επιτυχημένη προσvπά-
θεια να μελετηθεί η κίνησvη δύο σvωμάτων που αλληλεπιδρούν βαρυτικά
(πρόβλημα 2 σvωμάτων). O Bernoulli έδειξε ότι η τροχιά που μπορεί ναδιαγράψει ένα σvώμα, μπορεί να είναι είτε ελλειπτική, είτε παραβολικήείτε υπερβολική. Ο Euler έδειξε πως το πρόβλημά μπορεί να αναχθείσvε πρόβλημα της κίνησvης ενός σvώματος, με μάζα την ανηγμένη μάζα
του σvυσvτήματος µ =m1m2
m1 +m2
.
Μετά από τις παραπάνω ανακαλύψεις, ξεκίνησvε η προσvπάθεια για τημελέτη πιο πολύπλοκων σvυσvτημάτων, δηλαδή των 3 σvωμάτων και άνω.Ο Newton ασvχολήθηκε με το lunar problem (Ηλιος-Γη-Σελήνη) σvτοPrincipia χωρίς όμως κάποιο αποτέλεσvμα. O J. D' Alembert εισvή-γαγε τον όρο το πρόβλημα των 3 σvωμάτων και προσvπάθησvε να λύσvειτο πρόβλημα χρησvιμοποιώντας διαφορικές εξισvώσvεις. Στη σvυνέχεια oEuler το 1772 εισvήγαγε την ειδική περίπτωσvη του περιορισvμένου προβ-λήματος των 3 σvωμάτων (restricted 3 body problem), ενώ ο Joseph-Louis Lagrange κατάφερε να προσvδιορίσvει τα σvημεία ισvορροπίας σvτοσvυγκεκριμένο πρόβλημα.Αρκετοί ακόμη μεγάλοι επισvτήμονες ασvχολήθηκαν με το πρόβλημα
των 3 σvωμά- των, όπως o Carl Gustav Jacob Jacobi, o GeorgeWilliam Hill, o Charles-Eugène Delaunay σvυνεισvφέροντας αρκετάσvτην μελέτη του προβλήματος χωρίς όμως να βρεθεί η γενική του
λύσvη. Το 1887 ο βασvιλιάς της Σουηδίας, με αφορμή τα εξηκοσvτάτου γενέθλια, διοργάνωσvε ένα διαγωνισvμό απονέμοντας το βραβείο σvεόποιον μπορούσvε να δώσvει τη λύσvη σvτο πρόβλημα των Ν-σvωμάτων. ΟΓάλλος Jules Henri Poincaré κέρδισvε το βραβείο αποδεικνύοντας ότιτο πρόβλημα των Ν-σvωμάτων για N > 2 δεν έχει αναλυτική λύσvη, καιήταν ο πρώτος που εξέφρασvε τη βασvική αρχή της θεωρίας του χάους,ότι δηλαδή μικρές διαταραχές σvτις αρχικές σvυνθήκες προκαλούνμεγάλες διαφορές σvτο τελικό αποτέλεσvμα.
9
Το πρόβλημα τωνN-σvωμάτων διατυπώθηκε πρώτα απο τον Νεύτωνα.Θα κατασvκευάσvουμε τις εξισvώσvεις κίνησvης Ν-σvωμάτων με μάζες
mi(i = 1, 2, ...N) όπου τα διανύσvματα θέσvης Ri ορίζονται από ένα
σvταθερό σvημείο Ο, και η μεταξύ τους διανυσvματική απόσvτασvη είναι rijόπου
rij = Rj −Ri (2.1)
Σημειώνεται ότι το rijσvημαίνει ότι το διάνυσvμα ανάμεσvα σvτο mi και
σvτο mj έχει κατεύθυνσvη από το mi σvτο mj . Οπότε:
rij = −rji (2.2)
Από τους νόμους του Νεύτωνα και το νόμο της παγκόσvμιας έλξης,έχουμε:
miRi = GN∑j=1
mimj
r3ijrij, (j 6= i, i = 1, 2, ...N) (2.3)
2.1 Τα 10 ολοκληρώματα της κίνησvης.
Από την (2.3) αν πάρουμε το άθροισvμα για όλα τα σvώματα βρίσvκουμε:
N∑i=1
miRi = 0
γιατί παρουσvιάζονται όροι rij και rji που είναι αντίθετοι.ολοκληρώνοντας μία φορά βρίσvκουμε
N∑i=1
miRi = a (2.4)
και ολοκληρώνοντας άλλη μία
N∑i=1
miRi = at+ b (2.5)
όπου a, b σvταθερές.
10
Από τον ορισvμό του κέντρου μάζας ενός σvυσvτήματος από σvημειακές
μάζες, και ορίζοντας ως διάνυσvμα θέσvης του κέντρου μάζας Rcm:
MRcm =N∑i=1
miRi,
όπου
M =N∑i=1
mi,
βρίσvκουμε
Rcm =at+ b
M(2.6)
και
Rcm =a
M(2.7)
Οι εξισvώσvεις (2.6) και (2.7) δείχνουν οτι το κέντρο μάζας τουσvυσvτήματος κινείται σvτο χώρο με σvταθερή ταχύτητα. Αν ξαναγραφτούνοι εξισvώσvεις (2.6) και (2.7) ως προς ένα σvταθερό τρισvορθογώνιοσvύσvτημα αναφοράς με κέντρο το Ο, τότε τα έξι ολοκληρώματα είναιax, ay, az , bx, bybz.
Παίρνοντας το εξωτερικό γινόμενο των Ri και Rι για κάθε μια από
τις εξισvώσvεις της (2.3) και αθροίζοντας κατά μέλη, παρατηρούμε ότι
N∑i=1
miRi × Ri = GN∑i=1
N∑j=1
mimj
r3ijRi × rij, (j 6= i) (2.8)
Αλλά
Ri × rij = Ri × (Rj −Ri) = Ri ×Rj
και
Rj × rij = Rj ×Ri = −Ri ×Rj
Οπότε σvτο δεξί μέλος της (2.8) οι όροι του αθροίσvματος είναι ανάζεύγη αντίθετοι, οπότε
N∑i=1
miRi × Rι = 0
11
και ολοκληρώνοντας
N∑i=1
miRi × Ri = C (2.9)
Η σvχέσvη (2.9) δηλώνει ότι η σvυνολική ποσvότητα της σvτροφορμήςτου σvυσvτήματος παραμένει σvταθερή. Παρομοίως αν ξαναγραφτεί η(2.9) ως προς ένα αδρανειακό τρισvορθογώνιο σvύσvτημα σvυντεταγμένων,τότε
N∑i=1
mi(xiyi − yixi) = C1
N∑i=1
mi(yizi − ziyi) = C2
N∑i=1
mi(zixi − xizi) = C3
όπου
C2 = C21 + C2
2 + C23
΄Αρα η σvυνολική σvτροφορμή C2και οι C1, C2, C3 παραμένουν σvτα-
θερές, δίνοντας τρία ακόμη ανεξάρτητα ολοκληρώματα της κίνησvης.To 10ολοκλήρωμα προκύπτει από την (2.3) πολλαπλασvιασvμένη με
το διάνυσvμα της ταχύτητας Ri .
N∑i=1
miRi · Ri = GN∑i=1
N∑j=1
mimj
r3ijRi · rij (j 6= i) (2.10)
Ri · rij = Ri(Rj −Ri) (2.11)
και
Rj · rji = Rj(Ri −Rj) (2.12)
12
Αθροίζοντας τις (2.11) , (2.12)
Ri · rij + Rj · rji = −(Rj − Ri) · (Rj −Ri)
Χρησvιμοποιώντας την (2.1) , η (2.10) απο ολοκλήρωσvη, δίνει
1
2
N∑i=1
miRiRi −1
2G
N∑i=1
N∑j=1
mimj
rij= E (j 6= i) (2.13)
η ταχύτητα της i-οσvτής μάζας θα είναι
V 2i = RiRi
επίσvης
U =1
2G
N∑i=1
N∑j=1
mimj
rij
και η (2.13) γίνεται
T − U = E (2.13)
όπου
T =1
2
N∑i=1
miV2i
Ο πρώτος όρος σvτη (2.13) είναι η κινητική ενέργεια και το -U εί-ναι η δυναμική ενέργεια. Η (2.13) λοιπόν δηλώνει ότι η σvυνολικήενέργεια του σvυσvτήματος των Ν-σvωμάτων είναι σvταθερή, που είναι το10ολοκλήρωμα της κίνησvης. [A.E Roy]
13
2.2 Οι εξισvώσvεις της κίνησvης.
U =1
2G
N∑i=1
N∑j=1
mimj
rij
Αν i, j, k τα μοναδιαία διανύσvματα σvτους άξονες Ox, Oy, Oz τότε
∇U ≡ gradU = i∂U
∂x+ j
∂U
∂y+ k
∂U
∂z
επίσvης
Ri = ixi + jyi + kzi
άρα
miRi = gradiU (2.14)
gradiU = i∂U
∂xi+ j
∂U
∂yjk∂U
∂zkκαι οι εξισvώσvεις της κίνησvης θα είναι
mixi =∂U
∂xi
miyi =∂U
∂yi(2.15)
mizi =∂U
∂zi
2.3 Αριθμητική ολοκλήρωσvη με τη σvυμπλεκτική μέθοδο.
Για να μπορέσvουμε να προσvομοιώσvουμε το πρόβλημα των N-σvωμάτων,θα πρέπει να ολοκληρώσvουμε τις διαφορικές εξισvώσvεις με μία αρι-
θμητική μέθοδο
Οι σvυμπλεκτικοί ολοκληρωτές έχουν σvχεδιασvτεί για να λύνουν αρ-
ιθμιτικά τις εξισvώσvεις του Hamilton
p = −∂H∂q
, q =∂H
∂p(2.16)
όπου το q σvυμβολίζει τις σvυντεταγμένες θέσvης και το p τηςγενικευμένης ορμής.
14
΄Εσvτω η Χαμιλτονιανή σvυνάρτησvη
H(q,p) = T (p) + V (q) (2.17)
όπου Τ είναι η κινητική ενέργεια και V η δυναμική.Για να μελετήσvουμε ενα Χαμιλτονιανό σvύσvτημα θα πρέπει να
λάβουμε υπόψιν δύο βασvικά κριτήρια τα οποία δεν πρέπει να παρα-
βιάζονται, η σvυμπλεκτική ιδιότητα και η διατήρησvη της ενέργειας. Ησvυμπλεκτική ιδιότητα αναφέρεται σvτην διατήρησvη του εμβαδού σvτο
χώρο των φάσvεων (θεώρημα Liouville). Διανυσvματικά εκφράζεταιως:
dp× dq = dp′ × dq′
ενώ αλγεβρικά ως:
(q′
p′) = A(
qp
)
όπου A πίνακας με det(A) = 1Η διατήρησvη της ενέργειας εκφράζεται ως
H(q,p) = H(q′,p′) = constant
Αν προσvπαθήσvουμε να λύσvουμε τις εξισvώσvεις (2.16) με κάποια αρ-ιθμητική μέθοδο (π.χ. Runge-Kutta) θα δούμε ότι με τη πάροδο τουχρόνου τα σvφάλματα σvυσvσvωρεύονται και η ενέργεια δεν διατηρείται.Επίσvης μπορεί κάποια μέθοδος να κρατά την ενέργεια σvταθερή αλλά
να παραβιάζεται η σvυμπλεκτική σvυνθήκη, έτσvι ώσvτε να μας δίνει μιατροχιά η οποία δεν ανταποκρίνεται σvτη πραγματικότητα.Κατά τους Ge και Marsden (1988) δεν υπάρχει κάποια μέθοδος σvε
μη ολοκληρώσvιμα χαμιλτονιανά σvυσvτήματα, η οποία να τηρεί επακριβώςτα δύο παραπάνω κριτήρια. Υπάρχει όμως η κατηγορία τωνσvυμπλετικών ολοκληρωτών, οι οποίοι εκ κατασvκευής τους απαιτούννα τηρείται σvτο ακέραιο η σvυμπλεκτική σvυνθήκη και η ενέργεια να
μεταβάλλεται φραγμένα με ένα σvφάλμα ως προς την αρχική ενέργεια.Το σvφάλμα αυτό προσvδιορίζει την τάξη του σvυμπλεκτικού ολοκληρωτή
ως προς το βήμα.΄Εχουν αναπτυχθεί δύο βασvικές μέθοδοι σvυμπλεκτικών ολοκληρωτών,
η έμμεσvη (Implicit) και η άμεσvη (Explicit). Η έμμεσvη μέθοδος σvτηρίζε-ται σvτη λογική της εύρεσvης μιας άλλης Χαμιλτονιανής με τη βοήθεια
μιας κατάλληλα επιλεγμένης γενέτειρας σvυνάρτησvης και με τη χρήσvη
του κανονικού μετασvχηματισvμού.[Ο.Κότσvας]
15
Στο πρόγραμμα χρησvιμοποιείται η άμεσvη μέθοδος η οποία σvτηρίζε-
ται σvτην κατάλληλη σvύνθεσvη σvυμπλεκτικών απεικονίσvεων των χαμιλ-τονιανών T (p), V (q). Η (2.17) αποτελείται από δύο ολοκληρώσvιματμήματα. ΄Ετσvι, αν αγνοήσvουμε την Η = T (p), η λύσvη θα ήταν απλά
p = 0→ p′ = p,
∫qdt =
∫(∂H
∂p)p′=pdt→ q′ = q + τ
∂T
∂p
Η λύσvη είναι ακριβής και βέβαια η απεικόνισvη, ST (τ), είναι σvυμπλεκ-τική. Αντίσvτοιχα, αν Η = V (q), η απεικόνισvη SV (τ) θα έδινε επίσvηςτην ακριβή και σvυμπλεκτική λύσvη
q = 0→ q′ = q,
∫pdt = −
∫(∂H
∂q)q′=qdt→ p′ = p− τ ∂V
∂q
Το ερώτημα είναι λοιπόν το εξής: αν σvυνθέταμε αυτές τις δύοαπεικονίσvεις (η σvύνθεσvη θα δώσvει κατ' ανάγκην επίσvης σvυμπλεκτικήαπεικόνισvη) δηλαδή, λύναμε πρώτα την 1η εξίσvωσvη και μετά τη 2η(ή ανάποδα) αλλά χρησvιμοποιώντας σvτη 2η τις τιμές που προκύπτουναπό την επίλυσvη της 1ης θα παίρναμε την πραγματική λύσvη; Ηαπάντησvη είναι δυσvτυχώς όχι, αλλά η σvύνθεσvη των δύο σvτοιχειωδώναπεικονίσvεων θα μας έδινε μια λύσvη κοντά σvτην πραγματική, μεακρίβεια O(τ). Ο λόγος για τον οποίο η σvύνθεσvη
ST (τ)SV (τ) 6=SH(τ)
δε δίνει την SH(τ) μπορεί να γίνει κατανοητός με βάσvη τη γλώσvσvατης άλγεβρας Lie.
2.4 Μετατροπή τροχιακών σvτοιχείων σvε καρτεσvιανό
σvύσvτημα σvυντεταγμένων.
Για την εύρεσvη της θέσvης και της ταχύτητας από τα τροχιακά σvτοιχεία,δλδ
a, e, i, ω,Ω,M → X, Y, Z, X, Y , Z
ακολουθείται η εξής διαδικασvία:
16
Υπολογίζεται από την εξίσvωσvη του Kepler η έκκεντρη ανωμαλία,ΕΑ, (0 → 360)
M = EA− e · sinEAη αληθής ανωμαλία, v, (0 → 360)
tanv
2= [
(1 + e)
(1− e)]12 · tanEA
2
η ακτίνα, r,
r = a(1− e · cosEA) =a(1− e2)
1 + e · cosvη σvτροφορμή, h,
h = [µa(1− e2)]12
και βρίσvκεται η θεσvη
X = r[cosΩcos(ω + v)− sinΩsin(ω + v)cosi]
Y = r[sinΩcos(ω + v)− cosΩsin(ω + v)cosi]
Z = r[sini · sin(ω + v)]
και η ταχύτητα
X =Xhe
ra(1− e2)sinv − h
r(cosΩsin(ω + v) + sinΩcos(ω + v)cosi)
Y =Y he
ra(1− e2)sinv − h
r(sinΩsin(ω + v)− cosΩcos(ω + v)cosi)
Z =Xhe
ra(1− e2)sinv +
h
rsinicos(ω + v)
[CCAR]
17
3 Το πρόγραμμα.
18
3.1 Αρχικές σvυνθήκες.
΄Ολες οι πληροφορίες που χρειάζονται για να γίνει η αναπαράσvτασvη
είναι σvε αρχεία txt με τη μορφή:
Στο παράδειγμα αυτό υπάρχει ο ήλιος και δύο ακόμα σvώματα. Ημόνη πληροφορία που χρειάζεται για τον ήλιο είναι η μάζα του (Massof Star M = 1.0 ).Το βήμα που χρησvιμοποιείται: Internal Integration step dt κα-
θορίζει πόσvο μακριά θα είναι το επόμενο σvτιγμιότυπο. Ο Συμπλεκ-τικός Ολοκληρωτής ενεργεί και από το ~x(to) μας δίνει το ~x(t0 + ∆T )όπου ∆T = dt ·N .Τα σvτοιχεία για τον κάθε πλανήτη είναι με τη σvειρά: Mass η μάζα,
a ο μεγάλος ημιάξονας, ecc η εκκεντρότητα, incl η κλίσvη, Mη μέσvη ανωμαλία, om το όρισvμα του περικέντρου, OM το μήκοςαναβιβάζοντος σvυνδέσvμου, r η ακτίνα (της οποίας η τιμή δεν είναιαπαραίτητα σvε κλίμακα).
19
3.2 Περί του προγράμματος.
Tα πλανητικά σvυσvτήματα που αναπαρισvτώνται σvτην εργασvία αυτή είναι:α) το ασvτέρι HD 106315 το οποίο περιβάλλουν δύο πλανήτες και
βρίσvκεται σvε απόσvτασvη 107pc περίπου.
β) το ασvτέρι Kepler-9 το οποίο περιβάλλουν τρεις πλανήτες καιβρίσvκεται σvε απόσvτασvη 650pc περίπου.
20
γ) το ασvτέρι Gliese 876 το οποίο περιβάλλουν τέσvσvερις πλανήτεςκαι βρίσvκεται σvε απόσvτασvη 4.69pc περίπου.
δ) το ασvτέρι το δικό μας, το οποίο περιβάλλουν οκτώ πλανήτες.
21
ε) Ασvταθές σvύσvτημα.
σvτ) Σύσvτημα με το οποίο μπορεί να πειραματισvτεί ο χρήσvτης αλλά-ζοντας τις αρχικές σvυνθήκες.Τα σvτοιχεία που χρειάζονται και χρησvιμοποιούνται από το πρό-
γραμμα από αυτά τα σvυσvτήματα για να κάνουμε σvωσvτή αναπαράσvτασvη
της σvυμπεριφοράς τους υπάρχουν σvε txt αρχεία μαζί με τον κώδικα.
22
3.3 Η βασvική σvυνάρτησvη.
int main(int argc , char** argv)
file_input ();
X0 = new double[NEQ];
GetSystemPosV(oeb , X0);
NcurData = 0;
X = new double[NEQ];Y = new double[NEQ];
for (int i = 0; i < NEQ; i++)
X[i] = X0[i];double t = X[0] * t_metric;
glutInit (&argc , argv);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB |GLUT_DEPTH );glutInitWindowSize (1200, 700);glutInitWindowPosition (100, 100);glutCreateWindow(argv [0]);
init ();glutDisplayFunc(display );glutReshapeFunc(reshape );glutKeyboardFunc(keyDown );
glutKeyboardUpFunc(keyUp );SetupMenu ();
glutMainLoop ();return 0;
23
Η σvυνάρτησvη le_input() δέχεται το όνομα ενός αρχείου που περ-ιέχει τις πληροφορίες για τα πλανητικά σvυσvτήματα που μελετώνται και
τις διαβάζει. Η GetSystemPosV(oeb, X0) παίρνει τις πληροφορίες γιατα τροχιακά σvτοιχεία για να δώσvει τις αρχικές θέσvεις (και ταχύτητες)των πλανητών. ΄Οπου η oeb είναι τύπου OEDEF και ορίζεται ως:
typedef struct OrbitalElementsDefined
double a;double e;double i;double elpos;double omega;double Omega;int inputangle;int modedisplay;
OEDEF;
΄Επειτα ορίζονται 2 πίνακες X,Y με αριθμό σvτοιχείων NEQ (numberof equations). Η πρώτη θέσvη είναι για το χρόνο, μετά είναι σvε τριάδεςοι σvυντεταγμένες του κάθε πλανήτη και μετά σvε τριάδες οι ταχύτητες
του κάθε πλανήτη (σvτους άξονες x,y,z αντίσvτοιχα). Δίνονται οι πρώτεςτιμές αυτών σvτον πίνακα X όπως φαίνεται από εδώ:
for (int i = 0; i < NEQ; i++)
X[i] = X0[i];double t = X[0] * t_metric;
Εδώ φτιάχνονται το παράθυρο οι διασvτάσvεις, ο φωτισvμός και οtimer για να μπορούν να καλούνται οι επόμενες σvυναρτήσvεις κάθεκάποιο χρονικό διάσvτημα (σvυγκεκριμένα μερικά ms)
glutInit (&argc , argv);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB |GLUT_DEPTH );glutInitWindowSize (1200, 700);glutInitWindowPosition (100, 100);glutCreateWindow(argv [0]);init ();
24
Στη σvυνάρτησvη display ξεκινάει η λειτουργία της κάμερας η οποίασvτην αρχή κοιτάει σvτο (0,0,0) όπου βρίσvκεται το ασvτέρι του σvυσvτή-ματος. Σχεδιάζεται το skybox το οποίο είναι μια μέθοδος που χρησvι-μοποιείται για να δοθεί η αίσvθησvη βάθους και αποτελείται απο ένανκύβο σvτον οποίο εφαρμόζονται εικόνες (textures) που θέλουμε ναφαίνονται και σvυγκεκριμένα σvτο πρόγραμμα αυτό εικόνες με μακρινά
ασvτέρια για να προσvομοιωθεί το διάσvτημα.Οι πλανήτες φτιάχνονται από σvφαίρες που ορίζονται με τις εντολές:
GLUquadricObj* quadric=gluNewQuadric ();gluQuadricTexture(quadric , true);gluQuadricNormals(quadric , GLU_SMOOTH );
και τοποθετούνται ως:
glBindTexture(GL_TEXTURE_2D ,(planet)->getTextureHandle ());glPushMatrix ();glTranslatef(x, y, z);glRotatef(angle , x, y, z);gluSphere(quadric , radius , slices , stacks );glPopMatrix ();
Τις σvυντεταγμένες (x,y,z) τις παίρνουν από τη σvυνάρτησvη:
void Symplectic_translate ()
Symplectic6thRUN(X, Nsteps , dt , Y);t = Y[0];for (int i = 0; i < NEQ; i++)
Data[NcurData ][i] = X[i];X[i] = Y[i];
NcurData ++;
return;
η οποία χρησvιμοποιεί τον σvυμπλεκτικό ολοκληρωτή 6ης τάξης γιανα βρει τις σvυντεταγμένες και τις ταχύτητες του επόμενου βήματος.
25
Συγκεκριμένα η Symplectic6thRUN:
void Symplectic6thRUN ( double yin [ ] ,i n t n , double dt , double yout [ ] )
double ∗y = TM1;f o r ( i n t i = 0 ; i < neq ; i++) y [ i ] = yin [ i ] ;double t0 = y [ 0 ] ;f o r ( i n t i = 0 ; i < n ; i++)
Symplectic6thSTEP (y , dt ) ;f o r ( i n t i = 0 ; i<neq ; i++) yout [ i ] = y [ i ] ;r e turn ;
Παίρνει δηλαδή τον πίνακα Χ που περιέχει όλες τις πληροφορίες
(χρόνος, θέσvεις, ταχύτητες) και χρησvιμοποιώντας το βήμα που τουέχει δωθεί δίνει τις επόμενες θέσvεις και ταχύτητες (πίνακας Υ). Αυτέςμετά γράφονται πάνω σvτον Χ και την επόμενη φορά που θα καλεσvτεί
αυτή σvυνάρτησvη χρησvιμοποιεί αυτές για να δώσvει τις επόμενες. Ημεταβλητή NcuData η οποία σvτην αρχή έχει την τιμή 0 είναι ο αριθμόςτων σvτιγμιοτύπων για αυτό και ανεβαίνει κατά μονάδα κάθε φορά που
τρέχει η Symplectic_translate().
26
Οι τροχιές σvχεδιάζονται ως:
glDisable(GL_LIGHTING );int o = 0;for (int i = 0; i < NB; i++)
glBegin(GL_POINTS );for (int j = NcurData - 1; j > 0; j--)glVertex3f(Data[j][o+1],Data[j][o+2],Data[j][o+3]);o += 3;glEnd ();glEnable(GL_LIGHTING );
΄Οπου σvε κάθε καρέ ζωγραφίζονται τελείες για κάθε προηγούμενη
θέσvη των πλανητών. O Data[a][b] είναι ένας δισvδιάσvτατος πίνακαςσvτον οποίο το a σvυμβολίζει τον αριθμό των σvτιγμιοτύπων και τοb περιέχει τις πληροφορίες που χρειάζονται για κάθε σvτιγμιότυπο(NEQ).Οι επόμενες εντολές χρησvιμοποιούνται για την επανασvχεδίασvη του
παραθύρου όταν αλλάζει μέγεθος και την ενεργοποίησvη του πληκ-
τρολογίου και ποντικιού.
glutReshapeFunc(reshape );glutKeyboardFunc(keyDown );glutKeyboardUpFunc(keyUp );
Η SetupMenu() δείχνει τις διαφορετικές επιλογές πλανητικών σvυσvτη-μάτων. Αφού επιλεχθεί διαφορετικό πλανητικό σvύσvτημα διαβάζεται τοκαινούριο αρχείο μηδενίζεται η NcurData και ορίζονται οι πίνακες X,Yαπό την αρχή.
27
3.4 Αλληλεπίδρασvη με το πρόγραμμα.
Ταυτόχρονα με την κίνησvη των πλανητών διαγράφονται και οι τροχιές
τους οι οποίες απενεργοποιούνται με το κουμπί ο .Η κάμερα σvτο πρόγραμμα αυτό λειτουργεί ως εξής:Με τα κουμπιά w, s μετακινείται μπροσvτά και πίσvω αντίσvτοιχα.Με τα a, d μετακινείται αρισvτερά και δεξιά.Με τα q, e σvτρέφεται αρισvτερά και δεξιά.Με τα j, l σvτρέφεται αρισvτερά και δεξιά κοιτώντας το ίδιο επίπεδο.Με τα k, i σvτρέφεται προς τα πάνω και κάτω αντίσvτοιχα.Με τα , , . μικραίνει και μεγαλώνει αντίσvτοιχα η ταχύτητα με
την οποία μετακινείται η κάμερα.Το μενού ενεργοποιείται με δεξί κλικ και εμφανίζει τα υπάρχοντα
σvυσvτήματα.Στο πρόγραμμα υπάρχει και ένα αρχείο με το όνομα user_system
για να μπορεί ο χρήσvτης εύκολα να κάνει αλλαγές.Για να προσvτεθεί ή να αλλάξει κάποιο σvύσvτημα πρέπει να δημιουργη-
θεί ή να τροποποιηθεί ένα αρχείο της μορφής:
28
Για να προσvτεθεί και άλλο σvώμα πρέπει να προσvτεθεί μια καινούρια
γραμμή που θα έχει τη μάζα του σvώματος και τα κεπλέρια σvτοιχεία με
τη σvειρά που φαίνεται ( σvτο τέλος της γραμμής υπάρχει και η ακτίναr με την οποία θα εμφανισvτεί σvτην οθόνη) και να αλλάξει ο αριθμός:Number of Bodies (without SUN) . Το βήμα που χρησvιμοποιείται:Internal Integration step dt δεν πρέπει να γίνεται πολύ μεγάλο γιατίθα αρχίσvουν να σvυσvσvωρεύονται σvφάλματα σvτο σvύσvτημα.Αφού γίνουν αυτές οι αλλαγές τότε πρέπει να προσvτεθεί σvτην
σvυνάρτησvη myMenu(int n) μια εντολή:
case n+1: file_change ("name "); break;
και τέλος σvτην σvυνάρτησvη SetupMenu() να προσvτεθεί:
glutAddMenuEntry ("name", n+1);
όπου name το όνομα του txt αρχείου και n+1 ο αριθμός τηςεισvόδου.Για διαφορετικά textures για κάποιο πλανήτη αρκεί η αλλαγή της
εντολής
glBindTexture(GL_TEXTURE_2D ,venus ->getTextureHandle ());
όπου αντί για venus μπορεί να χρησvιμοποιηθεί οποιοδήποτε από τα:earth, jupiter, mars, mercury, moon, neptune, pluto, saturn, uranus.
29
3.5 main.cpp
//Publ ished under The MIT License (MIT)
#pragma warning ( d i s ab l e : 4018 )#pragma warning ( d i s ab l e : 4996) // unsa fe f unc t i on s#pragma warning ( d i s ab l e : 4305)
#inc lude <GL\ g lu t . h>#inc lude <solar_system\ tga . h>#inc lude <solar_system\camera . h>#inc lude <cs td io>#inc lude <c s td l i b >#inc lude <cmath>#inc lude <vector>
#inc lude <nbody\dgdsysNBs . h>#inc lude <nbody\giroeNBs . h>#inc lude <nbody\gTools . h>#inc lude <nbody\Symp6s . h>#inc lude <nbody\ r e s t r o e 3 . h>#inc lude <fstream>#inc lude <conio . h>#inc lude <nbody\drun0 . h>#inc lude <iostream>
#de f i n e NMAXPOINTS 100000
us ing namespace std ;
double ∗ rad iu s ;extern double dt ;extern OEDEF oeb [NMAXBODIES] ;extern i n t Nsteps ;extern i n t NB, NDOF, NEQ;double ∗X0 , ∗X ,∗Y;
double Data [NMAXPOINTS] [ 1 0 0 0 ] ;i n t NcurData ;
30
double t ;
// t o g g l e s i f o r b i t s are drawnbool showOrbits = true ;
void f i l e_ inpu t ( ) ;void f i l e_change ( char system_name [ ] ) ;void Symplectic6thRUN ( double yin [ ] , i n t n ,double dt , double yout [ ] ) ;void Symplec t i c_trans la te ( ) ;
// the s c r e en s i z ei n t screenWidth , sc reenHe ight ;
// The in s t ance o f the cameraCamera camera ;
// ho lds the s t a t e o f the c on t r o l s f o r thecamera − when true , the key f o r that c on t r o l i s be ing pre s s eds t r u c t Contro lState s
bool forward , backward , l e f t ,r i ght , yawLeft , yawRight , pitchUp ,pitchDown , r o l l L e f t , r o l lR i gh t ;
c on t r o l s ;
// The TGA texture conta in ing the p lanet t ex tu r e sand the s t a r s f o r the skyboxTGA ∗ s ta r s , ∗sun , ∗ j up i t e r , ∗mars ,∗mercury , ∗moon , ∗neptune , ∗pluto ,∗ saturn , ∗uranus , ∗venus ;
void myMenu( i n t n)
switch (n)case 1 : f i l e_change ("HD106315 " ) ;
break ;
31
case 2 : f i l e_change (" kep ler −9");break ;
case 3 : f i l e_change (" g l i e s e 8 7 6 " ) ;break ;
case 4 : f i l e_change ("Sun " ) ;break ;
case5 : f i l e_change (" unstab le " ) ;break ;
case 6 : f i l e_change (" user_program " ) ;break ;
case 7 : e x i t ( 0 ) ;X0 = new double [NEQ] ;
GetSystemPosV ( oeb , X0 ) ;
X = new double [NEQ] ;Y = new double [NEQ] ;
f o r ( i n t i = 0 ; i < NEQ; i++)
X[ i ] = X0 [ i ] ;t = X[ 0 ] ∗ t_metric ;
NcurData = 0 ;
f l o a t vec [ 3 ] ;vec [ 0 ] = 0 ;vec [ 1 ] = 0 ;vec [ 2 ] = 0 ;
camera . pointAt ( vec ) ;
g lutPostRed i sp lay ( ) ;
void Symplec t i c_trans la te ( )
32
Symplectic6thRUN (X, Nsteps , dt , Y) ;t = Y[ 0 ] ;
f o r ( i n t i = 0 ; i < NEQ; i++)
Data [ NcurData ] [ i ] = X[ i ] ;X[ i ] = Y[ i ] ;
NcurData++;// double dE = Ener0 − Energy (X) ;
// p r i n t f ("dE=%d\n" , dE ) ;// double dL = Lang0 − AngularMomentum(X) ;
r e turn ;
// t imer func t i on c a l l e d every 10ms or morevoid t imer ( i n t )
g lutPostRed i sp lay ( ) ; // post f o r d i sp l ay funcglutTimerFunc (10 , timer , 0 ) ;
// l im i t frame drawing to 100 fp s
void i n i t ( void )g lC l ea rCo lo r ( 0 . 0 , 0 . 0 , 0 . 0 , 0 . 0 ) ;glShadeModel (GL_SMOOTH) ;g lEnable (GL_TEXTURE_2D) ;
// s e t up l i g h t i n gglEnable (GL_LIGHTING) ;glMatrixMode (GL_MODELVIEW) ;g lLoadIdent i ty ( ) ;
GLfloat matSpecular [ ] = 1 . 0 , 1 . 0 , 1 . 0 , 1 . 0 ;GLfloat matAmbience [ ] = 0 . 3 , 0 . 3 , 0 . 3 , 1 . 0 ;GLfloat matShininess [ ] = 20 . 0 ;g lC l ea rCo lo r ( 0 . 0 , 0 . 0 , 0 . 0 , 0 . 0 ) ;
33
glShadeModel (GL_SMOOTH) ;
g lMa t e r i a l f v (GL_FRONT, GL_SPECULAR, matSpecular ) ;g lMa t e r i a l f v (GL_FRONT, GL_SHININESS, matShininess ) ;g lMa t e r i a l f v (GL_FRONT, GL_AMBIENT, matAmbience ) ;
GLfloat l ightAmbient [ ] = 0 . 3 , 0 . 3 , 0 . 3 , 1 . 0 ;GLfloat l i g h tD i f f u s e [ ] = 1 . 0 , 1 . 0 , 1 . 0 , 1 . 0 ;GLfloat l i g h tSp e cu l a r [ ] = 1 . 0 , 1 . 0 , 1 . 0 , 1 . 0 ;
g lL i gh t f v (GL_LIGHT0, GL_AMBIENT, l ightAmbient ) ;g lL i gh t f v (GL_LIGHT0, GL_DIFFUSE, l i g h tD i f f u s e ) ;g lL i gh t f v (GL_LIGHT0, GL_SPECULAR, l i g h t Sp e cu l a r ) ;
g lEnable (GL_LIGHTING) ;g lEnable (GL_LIGHT0) ;g lD i s ab l e (GL_LIGHTING) ;
s t a r s = new TGA(" images / s t a r s . tga " ) ;sun = new TGA(" images /sun . tga " ) ;j u p i t e r = new TGA(" images / j u p i t e r . tga " ) ;mars = new TGA(" images /mars . tga " ) ;mercury = new TGA(" images /mercury . tga " ) ;moon = new TGA(" images /moon . tga " ) ;neptune = new TGA(" images /neptune . tga " ) ;p luto = new TGA(" images / p luto . tga " ) ;saturn = new TGA(" images / saturn . tga " ) ;uranus = new TGA(" images /uranus . tga " ) ;venus = new TGA(" images /venus . tga " ) ;
// r e s e t c on t r o l sc on t r o l s . forward = f a l s e ;c on t r o l s . backward = f a l s e ;c on t r o l s . l e f t = f a l s e ;c on t r o l s . r i g h t = f a l s e ;c on t r o l s . r o l lR i gh t = f a l s e ;c on t r o l s . r o l l L e f t = f a l s e ;c on t r o l s . pitchDown = f a l s e ;c on t r o l s . pitchUp = f a l s e ;
34
c on t r o l s . yawLeft = f a l s e ;c on t r o l s . yawRight = f a l s e ;
t imer ( 0 ) ;
void drawCube ( void ) ;
void d i sp l ay ( void )i f ( c on t r o l s . forward ) camera . forward ( ) ;i f ( c on t r o l s . backward ) camera . backward ( ) ;i f ( c on t r o l s . l e f t ) camera . l e f t ( ) ;i f ( c on t r o l s . r i g h t ) camera . r i g h t ( ) ;i f ( c on t r o l s . yawLeft ) camera . yawLeft ( ) ;i f ( c on t r o l s . yawRight ) camera . yawRight ( ) ;i f ( c on t r o l s . r o l l L e f t ) camera . r o l l L e f t ( ) ;i f ( c on t r o l s . r o l lR i gh t ) camera . r o l lR i gh t ( ) ;i f ( c on t r o l s . pitchUp ) camera . pitchUp ( ) ;i f ( c on t r o l s . pitchDown ) camera . pitchDown ( ) ;
// c l e a r the bu f f e r sg lC l ea r (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ;g lCo l o r 3 f ( 1 . 0 , 1 . 0 , 1 . 0 ) ;
// s e t up the p e r sp e c t i v e matrix f o r r ender ing the 3d worldglMatrixMode (GL_PROJECTION) ;g lLoadIdent i ty ( ) ;g l uPe r spe c t i v e ( 70 . 0 f ,( f l o a t ) screenWidth /( f l o a t ) screenHeight , 0 .001 f , 500 .0 f ) ;glMatrixMode (GL_MODELVIEW) ;g lLoadIdent i ty ( ) ;
// perform the camera o r i e n t a t i o n trans formcamera . t rans fo rmOr ientat ion ( ) ;
// draw the skyboxglBindTexture (GL_TEXTURE_2D, s ta r s−>getTextureHandle ( ) ) ;drawCube ( ) ;
35
// perform the camera t r a n s l a t i o n trans formcamera . t rans fo rmTrans la t i on ( ) ;
GLfloat l i g h tP o s i t i o n [ ] = 0 . 0 , 0 . 0 , 0 . 0 , 1 . 0 ;g lL i gh t f v (GL_LIGHT0, GL_POSITION, l i g h tP o s i t i o n ) ;
// render the s o l a r systemglEnable (GL_DEPTH_TEST) ;g lEnable (GL_LIGHTING) ;
// render as a GLU sphere quadr ic ob j e c tGLUquadricObj∗ quadr ic = gluNewQuadric ( ) ;g luQuadricTexture ( quadric , t rue ) ;gluQuadricNormals ( quadric , GLU_SMOOTH) ;
Symplect i c_trans la te ( ) ;
glBindTexture (GL_TEXTURE_2D, sun−>getTextureHandle ( ) ) ;
glPushMatrix ( ) ;g lT r an s l a t e f (0 , 0 , 0 ) ;g lRota t e f (Y[ 0 ]∗ 1 0 , 0 . 0 f , 0 . 0 f , 1 . 0 f ) ;g lD i s ab l e (GL_LIGHTING) ;g luSphere ( quadric , 0 . 2 , 30 , 3 0 ) ;
// sunglEnable (GL_LIGHTING) ;glPopMatrix ( ) ;
i n t j ;j = 0 ;
f o r ( i n t i = 1 ; i <= NB; i++)
i f ( i == 1)
glBindTexture (GL_TEXTURE_2D, venus−>getTextureHandle ( ) ) ;
36
i f ( i == 2)
glBindTexture (GL_TEXTURE_2D, pluto−>getTextureHandle ( ) ) ;i f ( i == 3)
glBindTexture (GL_TEXTURE_2D, jup i t e r−>getTextureHandle ( ) ) ;i f ( i == 4)
glBindTexture (GL_TEXTURE_2D, mars−>getTextureHandle ( ) ) ;i f ( i == 5)
glBindTexture (GL_TEXTURE_2D, saturn−>getTextureHandle ( ) ) ;i f ( i > 5)
glBindTexture (GL_TEXTURE_2D, moon−>getTextureHandle ( ) ) ;
glPushMatrix ( ) ;g lT r an s l a t e f (Y[ 1 + j ] , Y[ 2 + j ] , Y[ 3 + j ] ) ;g luSphere ( quadric , r ad iu s [ i ] , 30 , 3 0 ) ;glPopMatrix ( ) ;j += 3 ;
i f ( showOrbits )g lD i s ab l e (GL_LIGHTING) ;i n t o = 0 ;f o r ( i n t i = 0 ; i < NB; i++)
glBeg in (GL_POINTS) ;f o r ( i n t j = NcurData − 1 ; j > 0 ; j−−)
g lVer t ex3 f (Data [ j ] [ o + 1 ] ,Data [ j ] [ o + 2 ] , Data [ j ] [ o + 3 ] ) ;
37
o += 3 ;
glEnd ( ) ;
g lEnable (GL_LIGHTING) ;
g lD i s ab l e (GL_LIGHTING) ;g lD i s ab l e (GL_DEPTH_TEST) ;
g lF lush ( ) ;g lutSwapBuf fers ( ) ;
void keyDown( unsigned char key , i n t x , i n t y )switch ( key )
case ' o ' :
showOrbits = ! showOrbits ; // t ogg l e show o r b i t sbreak ;
case ' , ' :camera . slowDown ( ) ; // slow down camerabreak ;
case ' . ' :camera . speedUp ( ) ; // speed up camerabreak ;
// these are a l l camera c on t r o l scase 'w ' :
c on t r o l s . forward = true ;break ;
case ' s ' :c o n t r o l s . backward = true ;break ;
case ' a ' :c o n t r o l s . l e f t = true ;break ;
case 'd ' :
38
c on t r o l s . r i g h t = true ;break ;
case ' l ' :c o n t r o l s . r o l lR i gh t = true ;break ;
case ' j ' :c o n t r o l s . r o l l L e f t = true ;break ;
case ' i ' :c o n t r o l s . pitchDown = true ;break ;
case 'k ' :c o n t r o l s . pitchUp = true ;break ;
case 'q ' :c o n t r o l s . yawLeft = true ;break ;
case ' e ' :c o n t r o l s . yawRight = true ;break ;
void keyUp( unsigned char key , i n t x , i n t y )switch ( key )
case 'w ' :
c on t r o l s . forward = f a l s e ;break ;
case ' s ' :c o n t r o l s . backward = f a l s e ;break ;
case ' a ' :c o n t r o l s . l e f t = f a l s e ;break ;
case 'd ' :c o n t r o l s . r i g h t = f a l s e ;break ;
39
case ' l ' :c o n t r o l s . r o l lR i gh t = f a l s e ;break ;
case ' j ' :c o n t r o l s . r o l l L e f t = f a l s e ;break ;
case ' i ' :c o n t r o l s . pitchDown = f a l s e ;break ;
case 'k ' :c o n t r o l s . pitchUp = f a l s e ;break ;
case 'q ' :c o n t r o l s . yawLeft = f a l s e ;break ;
case ' e ' :c o n t r o l s . yawRight = f a l s e ;break ;
void reshape ( i n t w, i n t h)screenWidth = w;sc reenHe ight = h ;glViewport (0 , 0 , ( GLs ize i )w, ( GLs ize i )h ) ;
void SetupMenu ( )glutCreateMenu (myMenu ) ;glutAddMenuEntry ("HD 106315" , 1 ) ;glutAddMenuEntry (" kep ler −9", 2 ) ;glutAddMenuEntry (" g l i e s e 8 7 6 " , 3 ) ;glutAddMenuEntry ("Sun" , 4 ) ;glutAddMenuEntry (" unstab le " , 5 ) ;glutAddMenuEntry (" user_system " , 6 ) ;glutAddMenuEntry (" e x i t " , 7 ) ;glutAttachMenu (GLUT_RIGHT_BUTTON) ;
40
i n t main ( i n t argc , char ∗∗ argv )rad iu s = new double [ 1 0 0 ] ;f i l e_ inpu t ( ) ;X0 = new double [NEQ] ;GetSystemPosV ( oeb , X0 ) ;NcurData = 0 ;X = new double [NEQ] ;Y = new double [NEQ] ;f o r ( i n t i = 0 ; i < NEQ; i++)
X[ i ] = X0 [ i ] ;
ouble t = X[ 0 ] ∗ t_metric ;
g l u t I n i t (&argc , argv ) ;g lut In i tDisp layMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH) ;g lutInitWindowSize (1200 , 700 ) ;g lut In i tWindowPos i t ion (100 , 100 ) ;glutCreateWindow ( argv [ 0 ] ) ;i n i t ( ) ;g lutDisplayFunc ( d i sp l ay ) ;glutReshapeFunc ( reshape ) ;glutKeyboardFunc (keyDown ) ;
glutKeyboardUpFunc (keyUp ) ;SetupMenu ( ) ;
glutMainLoop ( ) ;
r e turn 0 ;
void drawCube ( void )g lBeg in (GL_QUADS) ;// new fa c eglTexCoord2f ( 0 . 0 f , 0 . 0 f ) ; g lVe r t ex3 f (−1.0 f , −1.0 f , 1 . 0 f ) ;
41
glTexCoord2f ( 1 . 0 f , 0 . 0 f ) ; g lVe r t ex3 f ( 1 . 0 f , −1.0 f , 1 . 0 f ) ;glTexCoord2f ( 1 . 0 f , 1 . 0 f ) ; g lVe r t ex3 f ( 1 . 0 f , 1 . 0 f , 1 . 0 f ) ;glTexCoord2f ( 0 . 0 f , 1 . 0 f ) ; g lVe r t ex3 f (−1.0 f , 1 . 0 f , 1 . 0 f ) ;// new fa c eglTexCoord2f ( 0 . 0 f , 0 . 0 f ) ; g lVe r t ex3 f ( 1 . 0 f , 1 . 0 f , 1 . 0 f ) ;glTexCoord2f ( 1 . 0 f , 0 . 0 f ) ; g lVe r t ex3 f ( 1 . 0 f , 1 . 0 f , −1.0 f ) ;glTexCoord2f ( 1 . 0 f , 1 . 0 f ) ; g lVe r t ex3 f ( 1 . 0 f , −1.0 f , −1.0 f ) ;glTexCoord2f ( 0 . 0 f , 1 . 0 f ) ; g lVe r t ex3 f ( 1 . 0 f , −1.0 f , 1 . 0 f ) ;// new fa c eglTexCoord2f ( 0 . 0 f , 0 . 0 f ) ; g lVe r t ex3 f ( 1 . 0 f , 1 . 0 f , −1.0 f ) ;glTexCoord2f ( 1 . 0 f , 0 . 0 f ) ; g lVe r t ex3 f (−1.0 f , 1 . 0 f , −1.0 f ) ;glTexCoord2f ( 1 . 0 f , 1 . 0 f ) ; g lVe r t ex3 f (−1.0 f , −1.0 f , −1.0 f ) ;glTexCoord2f ( 0 . 0 f , 1 . 0 f ) ; g lVe r t ex3 f ( 1 . 0 f , −1.0 f , −1.0 f ) ;// new fa c eglTexCoord2f ( 0 . 0 f , 0 . 0 f ) ; g lVe r t ex3 f (−1.0 f , −1.0 f , −1.0 f ) ;glTexCoord2f ( 1 . 0 f , 0 . 0 f ) ; g lVe r t ex3 f (−1.0 f , −1.0 f , 1 . 0 f ) ;glTexCoord2f ( 1 . 0 f , 1 . 0 f ) ; g lVe r t ex3 f (−1.0 f , 1 . 0 f , 1 . 0 f ) ;glTexCoord2f ( 0 . 0 f , 1 . 0 f ) ; g lVe r t ex3 f (−1.0 f , 1 . 0 f , −1.0 f ) ;// new fa c eglTexCoord2f ( 0 . 0 f , 0 . 0 f ) ; g lVe r t ex3 f (−1.0 f , 1 . 0 f , −1.0 f ) ;glTexCoord2f ( 1 . 0 f , 0 . 0 f ) ; g lVe r t ex3 f ( 1 . 0 f , 1 . 0 f , −1.0 f ) ;glTexCoord2f ( 1 . 0 f , 1 . 0 f ) ; g lVe r t ex3 f ( 1 . 0 f , 1 . 0 f , 1 . 0 f ) ;glTexCoord2f ( 0 . 0 f , 1 . 0 f ) ; g lVe r t ex3 f (−1.0 f , 1 . 0 f , 1 . 0 f ) ;// new fa c eglTexCoord2f ( 0 . 0 f , 0 . 0 f ) ; g lVe r t ex3 f (−1.0 f , −1.0 f , −1.0 f ) ;glTexCoord2f ( 1 . 0 f , 0 . 0 f ) ; g lVe r t ex3 f ( 1 . 0 f , −1.0 f , −1.0 f ) ;glTexCoord2f ( 1 . 0 f , 1 . 0 f ) ; g lVe r t ex3 f ( 1 . 0 f , −1.0 f , 1 . 0 f ) ;glTexCoord2f ( 0 . 0 f , 1 . 0 f ) ; g lVe r t ex3 f (−1.0 f , −1.0 f , 1 . 0 f ) ;
glEnd ( ) ;
References
[1] A.E Roy , Orbital motion , Adam-Hilger , 1982
[2] Γ. Βουγιατζής , Μαθήματα -Σημειώσvεις OpenGL , ΣημειώσvειςΠΜΣ Υπολογισvτικής Φυσvικής , ΑΠΘ , 2010
[3] Ο.Κότσvας , Μελέτη της δυναμικής σvυσvτημάτων τριών πλανητών: ευσvτάθεια και παγίδευσvη σvε σvυντονισvμούς , 2015
42
[4] Δ.Σκουλίδου , Συμπλεκτική ολοκλήρωσvη του προβλήματος τωνΝ σvωμάτων και εφαρμογή σvε εξωηλιακά σvυσvτήματα , ΔιπλωματικήΕργασvία ,Τμήμα Φυσvικής , ΑΠΘ , 2017
[5] Κ.Τσvιγάνης , Υπολογισvτική Ασvτροδυναμική : Το πρόβλημα τωνδύο σvωμάτων , Σημειώσvεις ΠΜΣ Υπολογισvτικής Φυσvικής , ΑΠΘ, 2012
[6] H.Yoshida,Cel. Mech. Dyn. Astron. 1993
[7] Colorado Center for Astrodynamics Research (CCAR) ,2002
43