<p>我又对这个问题进行了一次破解,只是看看流星围绕着一颗行星的问题。或者在这种情况下,月亮作为我选择的代莫斯作为我的模型。我试图按比例工作,使坐标系为1像素=1公里。起初,Deimos位于一片流星场中,每颗流星都有一个随机的航向,但它们的大小和速度都相同:</p>
<pre><code>from turtle import Turtle, Screen
from random import random
METEOR_VELOCITY = 0.011 # kilometers per second
METEOR_RADIUS = 0.5 # kilometers
SECONDS_PER_FRAME = 1000 # each updates represents this many seconds passed
UPDATES_PER_SECOND = 100
DEIMOS_RADIUS = 6.2 # kilometers
G = 0.000003 # Deimos gravitational constant in kilometers per second squared
CURSOR_SIZE = 20
def follow():
global meteors
new_meteors = []
t = SECONDS_PER_FRAME
for (x, y), velocity, heading, stamp in meteors:
meteor.clearstamp(stamp)
meteor.goto(x, y)
meteor.setheading(heading)
meteor.forward(velocity * t)
meteor.setheading(meteor.towards(deimos))
meteor.forward(G * t * t)
meteor.setheading(180 + meteor.towards(x, y))
if meteor.distance(deimos) > DEIMOS_RADIUS * 2:
new_meteors.append((meteor.position(), velocity, meteor.heading(), meteor.stamp()))
screen.update()
meteors = new_meteors
if meteors:
screen.ontimer(follow, 1000 // UPDATES_PER_SECOND)
def create():
""" create()'s dots with meteor """
count = 0
nux, nuy = -400, 300
while nuy > -400:
meteor.goto(nux, nuy)
if meteor.distance(deimos) > DEIMOS_RADIUS * 2:
heading = random() * 360
meteor.setheading(heading) # all meteors have random heading but fixed velocity
meteors.append((meteor.position(), METEOR_VELOCITY, meteor.heading(), meteor.stamp()))
nux += 20
count += 1
if count % 40 == 0:
nuy -= 50
nux = -400
screen.update()
meteors = []
screen = Screen()
screen.screensize(1000, 1000)
screen.setworldcoordinates(-500, -500, 499, 499) # 1 pixel = 1 kilometer
meteor = Turtle('circle', visible=False)
meteor.shapesize(2 * METEOR_RADIUS / CURSOR_SIZE)
meteor.speed('fastest')
meteor.color('purple')
meteor.penup()
deimos = Turtle('circle')
deimos.shapesize(2 * DEIMOS_RADIUS / CURSOR_SIZE)
deimos.color("orange")
deimos.penup()
screen.tracer(False)
create()
follow()
screen.mainloop()
</code></pre>
<p>要研究的第一个变量是<code>METEOR_VELOCITY</code>。在所提供的背景下,大多数流星会撞上月球,但也有少数流星会获得轨道速度。如果你把它的价值减半,所有的流星都会撞上月球。如果你把它的值翻一番,少数流星会获得逃逸速度,离开窗口;少数流星可能撞上月球;大多数流星会形成一个轨道云,变得越来越小,越来越紧。你知道吗</p>
<p>我扔掉了三角函数的东西,又回到度而不是弧度。我用向量加法逻辑来计算运动。你知道吗</p>
<p>最后,这只是一个粗糙的模型。你知道吗</p>