mirror of
https://github.com/python/cpython.git
synced 2024-11-24 08:52:25 +01:00
c8b45a385a
* gh-118673: Remove shebang and executable bits from stdlib modules. * Removed shebangs and exe bits on turtledemo scripts. The setting was inappropriate for '__main__' and inconsistent across the other modules. The scripts can still be executed directly by invoking with the desired interpreter.
111 lines
2.7 KiB
Python
111 lines
2.7 KiB
Python
""" 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 the
|
|
mouse over the scrollbar of the canvas.
|
|
|
|
"""
|
|
from turtle import Shape, Turtle, mainloop, Vec2D as Vec
|
|
|
|
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__':
|
|
main()
|
|
mainloop()
|