Skip to content

Instantly share code, notes, and snippets.

@CodeDotJS
Last active May 29, 2024 03:53
Show Gist options
  • Save CodeDotJS/64f0d3d86d05b93af3b6 to your computer and use it in GitHub Desktop.
Save CodeDotJS/64f0d3d86d05b93af3b6 to your computer and use it in GitHub Desktop.
Solar System using Python
import turtle
import math
class SolarSystem:
def __init__(self, width, height):
self.thesun = None
self.planets = []
self.ssturtle = turtle.Turtle()
self.ssturtle.hideturtle()
self.ssscreen = turtle.Screen()
self.ssscreen.setworldcoordinates(-width/2.0,-height/2.0,width/2.0,height/2.0)
self.ssscreen.tracer(50)
def addPlanet(self, aplanet):
self.planets.append(aplanet)
def addSun(self, asun):
self.thesun = asun
def showPlanets(self):
for aplanet in self.planets:
print(aplanet)
def freeze(self):
self.ssscreen.exitonclick()
def movePlanets(self):
G = .1
dt = .001
for p in self.planets:
p.moveTo(p.getXPos() + dt * p.getXVel(), p.getYPos() + dt * p.getYVel())
rx = self.thesun.getXPos() - p.getXPos()
ry = self.thesun.getYPos() - p.getYPos()
r = math.sqrt(rx**2 + ry**2)
accx = G * self.thesun.getMass()*rx/r**3
accy = G * self.thesun.getMass()*ry/r**3
p.setXVel(p.getXVel() + dt * accx)
p.setYVel(p.getYVel() + dt * accy)
class Sun:
def __init__(self, iname, irad, im, itemp):
self.name = iname
self.radius = irad
self.mass = im
self.temp = itemp
self.x = 0
self.y = 0
self.sturtle = turtle.Turtle()
self.sturtle.shape("circle")
self.sturtle.color("yellow")
def getName(self):
return self.name
def getRadius(self):
return self.radius
def getMass(self):
return self.mass
def getTemperature(self):
return self.temp
def getVolume(self):
v = 4.0/3 * math.pi * self.radius**3
return v
def getSurfaceArea(self):
sa = 4.0 * math.pi * self.radius**2
return sa
def getDensity(self):
d = self.mass / self.getVolume()
return d
def setName(self, newname):
self.name = newname
def __str__(self):
return self.name
def getXPos(self):
return self.x
def getYPos(self):
return self.y
class Planet:
def __init__(self, iname, irad, im, idist, ivx, ivy, ic):
self.name = iname
self.radius = irad
self.mass = im
self.distance = idist
self.x = idist
self.y = 0
self.velx = ivx
self.vely = ivy
self.color = ic
self.pturtle = turtle.Turtle()
self.pturtle.up()
self.pturtle.color(self.color)
self.pturtle.shape("circle")
self.pturtle.goto(self.x,self.y)
self.pturtle.down()
def getName(self):
return self.name
def getRadius(self):
return self.radius
def getMass(self):
return self.mass
def getDistance(self):
return self.distance
def getVolume(self):
v = 4.0/3 * math.pi * self.radius**3
return v
def getSurfaceArea(self):
sa = 4.0 * math.pi * self.radius**2
return sa
def getDensity(self):
d = self.mass / self.getVolume()
return d
def setName(self, newname):
self.name = newname
def show(self):
print(self.name)
def __str__(self):
return self.name
def moveTo(self, newx, newy):
self.x = newx
self.y = newy
self.pturtle.goto(newx, newy)
def getXPos(self):
return self.x
def getYPos(self):
return self.y
def getXVel(self):
return self.velx
def getYVel(self):
return self.vely
def setXVel(self, newvx):
self.velx = newvx
def setYVel(self, newvy):
self.vely = newvy
def createSSandAnimate():
ss = SolarSystem(2,2)
sun = Sun("SUN", 5000, 10, 5800)
ss.addSun(sun)
m = Planet("MERCURY", 19.5, 1000, .25, 0, 2, "blue")
ss.addPlanet(m)
m = Planet("EARTH", 47.5, 5000, 0.3, 0, 2.0, "green")
ss.addPlanet(m)
m = Planet("MARS", 50, 9000, 0.5, 0, 1.63, "red")
ss.addPlanet(m)
m = Planet("JUPITER", 100, 49000, 0.7, 0, 1, "black")
ss.addPlanet(m)
m = Planet("Pluto", 1, 500, 0.9, 0, .5, "orange")
ss.addPlanet(m)
m = Planet("Asteroid", 1, 500, 1.0, 0, .75, "cyan")
ss.addPlanet(m)
numTimePeriods = 20000
for amove in range(numTimePeriods):
ss.movePlanets()
ss.freeze()
createSSandAnimate()
@RMuskovets
Copy link

okay, but when i ran it, planets werent normally running by their orbit.

@gutzbenj
Copy link

Ofcourse not, you should get the information for the starting velocity first. Then you can add on this velocity future movements by gravitational forces.

@James-Cuadra
Copy link

Hi, I am trying to recreate this for fun but I have an issue and it would be great if you could help.
How did you determine the way the planets will move depending on their mass and distance to the Sun? i.e. what equations and what data you needed to know about each planet..
Thanks

@gutzbenj
Copy link

gutzbenj commented Apr 23, 2020

@James74351595 Let's say you have a timeseries of positions of the planets. Then following steps should help you:

  • Step 1: Select starting point 0 with a preceeding -1
  • Step 2: From those two steps calculate the starting velocity of the planets by dividing the subtraction the two positions by the time that has passed between the two points
  • Step 3: Start iterating through the planets to calculate the gravitational forces of every other body in the system on that one body
  • Step 4: Add the resulting vector of forces on the current velocity of the body
  • Step 5: -> Step 2

@greenvi
Copy link

greenvi commented Jun 9, 2022

wow, nice.... Im impressed.

@ajmal-13
Copy link

I begin to learn python programming I attend my first session today and I get to know ur page in Instagram and this reels was amazing..It improved my interest in learning python ..

@MahsaYav
Copy link

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment