Seite 1 von 1

Wie implementieren, dass Planeten auch miteinander interagieren und nicht nur mit Sonne

Verfasst: Donnerstag 6. September 2018, 19:01
von Caturix99
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

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

Re: Wie implementieren, dass Planeten auch miteinander interagieren und nicht nur mit Sonne

Verfasst: Donnerstag 6. September 2018, 23:09
von /me
Celebrity Deathmatch: Schlaufe vs. Schleife

Re: Wie implementieren, dass Planeten auch miteinander interagieren und nicht nur mit Sonne

Verfasst: Freitag 7. September 2018, 07:04
von MagBen

Code: Alles auswählen

for planet1 in planets:
        g_force = g * sun.mass * planet1.mass * (sun.pos - planet1.pos).norm()  / (sun.pos - planet1.pos).mag2
        

        for planet2 in planets:
            if planet1==planet2:
                continue
            g_force += g * planet2.mass * planet1.mass * (planet2.pos - planet1.pos).norm()  / (planet2.pos - planet1.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.
        planet1.velocity += ( g_force / planet1.mass) * dt #Richtungsänderung
 
        #Diese Änderung wird zur alten Position addiert = neue Position
        planet1.pos += planet1.velocity * dt 
Wenn du die Sonne auch noch in die "Planeten" Liste tust, dann brauchst du so auch keine Extra-Behandlung der Sonne mehr. Eventuell könntest du dann "Planet" zu "Body" umbenennen.

Re: Wie implementieren, dass Planeten auch miteinander interagieren und nicht nur mit Sonne

Verfasst: Freitag 7. September 2018, 08:28
von kbr
Wenn Du Masse, Geschwindigkeite und Position im Raum als Anfangswerte hast, sollten zwei for-Schleifen für eine einfache Simulation genügen (dt geht dann in calc_partial_vector ein):

Code: Alles auswählen

while as long as you want to do it:
    for planet in planets:
        for other_planet in planets:
            if other_planet is planet:
                continue
            planet.calc_partial_vector(other_planet)
        planet.combine_vectors()
    move(planets)