-
-
Save CodeDotJS/64f0d3d86d05b93af3b6 to your computer and use it in GitHub Desktop.
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() |
Ofcourse not, you should get the information for the starting velocity first. Then you can add on this velocity future movements by gravitational forces.
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
@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
wow, nice.... Im impressed.
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 ..
If you need to learn Python:
https://youtu.be/-xVhFMNdGR0?si=RQtwkSu6Znv_xXeb
okay, but when i ran it, planets werent normally running by their orbit.