mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 10:26:02 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			111 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			111 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 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()
 | 
