Wie implementieren, dass Planeten auch miteinander interagieren und nicht nur mit Sonne
Verfasst: Donnerstag 6. September 2018, 19:01
Ich programmiere ein Sonnensystem und habe im Moment alle Planeten mit der Sonne am interagieren. Nun will ich es auch noch versuchen , dass jeder Planet mit jedem anderen Planeten interagiert (Schwerkraft).
Ich habe mir das so gedacht, dass ich das mit einer 2-Fachen for Schlaufe schaffen könnte. Also eine in der anderen. Ich habe das mal versucht aber leider funktioniert es nicht. Könnt ihr mir vlt. weiterhelfen. Ich glaube das Problem liegt auch darin das ich vorher immer einen festen Fixpunkt (Sonne) hatte und jetzt steht halt immer Planet.
Hier ist mein Code
Ich habe mir das so gedacht, dass ich das mit einer 2-Fachen for Schlaufe schaffen könnte. Also eine in der anderen. Ich habe das mal versucht aber leider funktioniert es nicht. Könnt ihr mir vlt. weiterhelfen. Ich glaube das Problem liegt auch darin das ich vorher immer einen festen Fixpunkt (Sonne) hatte und jetzt steht halt immer Planet.
Hier ist mein Code
Code: Alles auswählen
from vpython import *
#Konstanten zum rechnen
s_rad0 = 6.9e8
s_rad1 = 10 * s_rad0
e_rad = s_rad1 * 0.65
m_rad = e_rad * 0.4
ae = 200 * s_rad0 #1 Astr. Einheit bezieht sich auf Ent. Sonne-Erde
ae2 = 200 * s_rad0 #bezieht sich auf Ent. Sonne-Mond
g = 6.6725e-11
framerate = 100
#array liste von Planeten
planets = []
class Sphere(object):
def __init__(self, pos, radius, make_trail):
self.pos = pos
self.radius = radius
self.make_trail = make_trail
class planet(Sphere):
def __init__(self, pos, radius, make_trail, mass, velocity):
super().__init__(pos, radius, make_trail)
self.mass = mass
self.velocity = velocity
planetSphere = sphere (pos = self.pos, radius = self.radius, make_trail = self.make_trail, mass = self.mass, velocity = self.velocity)
sun = planet(pos=vec(0,0,0),radius=s_rad1*1.5, make_trail=True, mass=2e30, velocity=vec(0,0,0))
mercury = planet(pos=vec(ae/3,0,0), radius=s_rad1/1.5, make_trail=True, mass=3.25e23, velocity=vec(0,0,-47000))
venus = planet(pos=vec(ae/1.6,0,0), radius=s_rad1/1.3, make_trail=True, mass=4.9e24, velocity=vec(0,0,-35000))
earth = planet(pos=vec(ae,0,0), radius=e_rad, mass=5.9e24, make_trail=True, velocity=vec(0,0,-25000))
mars = planet(pos=vec(ae*1.52,0,0), radius=s_rad1/1.8, make_trail=True, mass=6.4e23, velocity=vec(0,0,-24000))
jupiter = planet(pos=vec(ae*5.18,0,0), radius=s_rad1/1.2, make_trail=True, mass=10e27, velocity=vec(0,0,-9678))
saturn = planet(pos=vec(ae*9.5,0,0), radius=s_rad1/1.4, make_trail=True, mass=5.7e26, velocity=vec(0,0,-7678))
uranus = planet(pos=vec(ae*19.13,0,0), radius=s_rad1/1.7, make_trail=True, mass=8.7e25, velocity=vec(0,0,-6772))
neptun = planet(pos=vec(ae*30,0,0), radius=s_rad1/1.7, make_trail=True, mass=1.02e26, velocity=vec(0,0,-5344))
pluto = planet(pos=vec(ae*39.37,0,0), radius=s_rad1/2.4, make_trail=True, mass=1.3e22, velocity=vec(0,0,-4740))
planets.extend((mercury,venus,earth,mars,jupiter,saturn,uranus,neptun,pluto))
dt = 10000
time = 0.1
while (True):
rate(framerate)
#for-Schlaufe für Berechnung jedes einzelnen Planeten
g_forceS = vec(0,0,0)
for planet in planets:
g_force = g * sun.mass * planet.mass * (sun.pos - planet.pos).norm() / (sun.pos - planet.pos).mag2
for planet in planets:
g_force = g * planet.mass * planet.mass * (planet.pos - planet.pos).norm() / (planet.pos - planet.pos).mag2
#Sonne
g_forceS -= g_force
#Änderung des Velocity Vektor wird zum alten addiert
#Da a=F/m // V = a*t(a*dt) 2 Geschw. vektoriell durch F/m ausgedrückt.
planet.velocity = planet.velocity + ( g_force / planet.mass) * dt #Richtungsänderung
#Diese Änderung wird zur alten Position addiert = neue Position
planet.pos += planet.velocity * dt
sun.velocity = sun.velocity + ( g_forceS / sun.mass) * dt #Richtungsänderung
sun.pos += sun.velocity * dt