mirror of
https://github.com/python/cpython.git
synced 2025-07-25 20:24:11 +00:00

requires them. Disable executable bits and shebang lines in test and benchmark files in order to prevent using a random system python, and in source files of modules which don't provide command line interface. Fixed shebang line to use python3 executable in the unittestgui script.
113 lines
2.8 KiB
Python
Executable file
113 lines
2.8 KiB
Python
Executable file
#!/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()
|