summaryrefslogtreecommitdiffstats
path: root/Lib/turtledemo/planet_and_moon.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/turtledemo/planet_and_moon.py')
-rw-r--r--Lib/turtledemo/planet_and_moon.py113
1 files changed, 113 insertions, 0 deletions
diff --git a/Lib/turtledemo/planet_and_moon.py b/Lib/turtledemo/planet_and_moon.py
new file mode 100644
index 0000000..14c4bbc
--- /dev/null
+++ b/Lib/turtledemo/planet_and_moon.py
@@ -0,0 +1,113 @@
+#!/usr/bin/env python3
+""" turtle-example-suite:
+
+ tdemo_planets_and_moon.py
+
+Gravitational system simulation using the
+approximation method from Feynman-lectures,
+p.9-8, using turtlegraphics.
+
+Example: heavy central body, light planet,
+very light moon!
+Planet has a circular orbit, moon a stable
+orbit around the planet.
+
+You can hold the movement temporarily by pressing
+the left mouse button with mouse over the
+scrollbar of the canvas.
+
+"""
+from turtle import Shape, Turtle, mainloop, Vec2D as Vec
+from time import sleep
+
+G = 8
+
+class GravSys(object):
+ def __init__(self):
+ self.planets = []
+ self.t = 0
+ self.dt = 0.01
+ def init(self):
+ for p in self.planets:
+ p.init()
+ def start(self):
+ for i in range(10000):
+ self.t += self.dt
+ for p in self.planets:
+ p.step()
+
+class Star(Turtle):
+ def __init__(self, m, x, v, gravSys, shape):
+ Turtle.__init__(self, shape=shape)
+ self.penup()
+ self.m = m
+ self.setpos(x)
+ self.v = v
+ gravSys.planets.append(self)
+ self.gravSys = gravSys
+ self.resizemode("user")
+ self.pendown()
+ def init(self):
+ dt = self.gravSys.dt
+ self.a = self.acc()
+ self.v = self.v + 0.5*dt*self.a
+ def acc(self):
+ a = Vec(0,0)
+ for planet in self.gravSys.planets:
+ if planet != self:
+ v = planet.pos()-self.pos()
+ a += (G*planet.m/abs(v)**3)*v
+ return a
+ def step(self):
+ dt = self.gravSys.dt
+ self.setpos(self.pos() + dt*self.v)
+ if self.gravSys.planets.index(self) != 0:
+ self.setheading(self.towards(self.gravSys.planets[0]))
+ self.a = self.acc()
+ self.v = self.v + dt*self.a
+
+## create compound yellow/blue turtleshape for planets
+
+def main():
+ s = Turtle()
+ s.reset()
+ s.getscreen().tracer(0,0)
+ s.ht()
+ s.pu()
+ s.fd(6)
+ s.lt(90)
+ s.begin_poly()
+ s.circle(6, 180)
+ s.end_poly()
+ m1 = s.get_poly()
+ s.begin_poly()
+ s.circle(6,180)
+ s.end_poly()
+ m2 = s.get_poly()
+
+ planetshape = Shape("compound")
+ planetshape.addcomponent(m1,"orange")
+ planetshape.addcomponent(m2,"blue")
+ s.getscreen().register_shape("planet", planetshape)
+ s.getscreen().tracer(1,0)
+
+ ## setup gravitational system
+ gs = GravSys()
+ sun = Star(1000000, Vec(0,0), Vec(0,-2.5), gs, "circle")
+ sun.color("yellow")
+ sun.shapesize(1.8)
+ sun.pu()
+ earth = Star(12500, Vec(210,0), Vec(0,195), gs, "planet")
+ earth.pencolor("green")
+ earth.shapesize(0.8)
+ moon = Star(1, Vec(220,0), Vec(0,295), gs, "planet")
+ moon.pencolor("blue")
+ moon.shapesize(0.5)
+ gs.init()
+ gs.start()
+ return "Done!"
+
+if __name__ == '__main__':
+ msg = main()
+ print(msg)
+ #mainloop()