python - 在体育场弹跳球
问题描述
我正在尝试使用 Turtle 使球在类似体育场的表面的侧面反弹。我有正确的弹跳角度,但有一些问题:有时,当球碰到圆边时,它不会直接弹跳,而是越过边缘并持续一段时间。
这是程序的一部分:
while nbrebonds>=0: #rebonds means bounce
forward(1)
if (xcor()<-150 and distance(-150,50)>100) or (xcor()>150 and distance(150,50)>100):
trajectoire=heading()
normale = towards(0,0) #direction de la normale
trajectoire = 2*normale-180-trajectoire
print(trajectoire) #trajectoire du rebond
setheading(trajectoire)
forward(1)
nbrebonds+=-1
print(nbrebonds)
if ycor()<-50 or ycor()>150:
trajectoire=heading()
trajectoire=360-trajectoire
setheading(trajectoire)
nbrebonds+=-1
print(nbrebonds)
解决方案
您计算方向的方式normale
是错误的:它应该是朝向曲线中心的方向,而不是(0, 0)
在这种情况下没有特殊含义的点。
因此,您可以将代码更改为:
while nbrebonds >= 0: #rebonds means bounce
forward(1)
if (xcor() < -150 and distance(-150, 50) > 100) or (xcor() > 150 and distance(150,50) > 100):
trajectoire = heading()
if xcor() < -150:
normale = towards(-150, 50) #direction de la normale : vers le centre de la courbe
else:
normale = towards(150, 50)
trajectoire = 2*normale-180-trajectoire
print(trajectoire) # trajectoire du rebond
setheading(trajectoire)
forward(1)
nbrebonds -= 1 # plutôt que += -1
print(nbrebonds)
if ycor() < -50 or ycor() > 150:
trajectoire = heading()
trajectoire = 360-trajectoire
setheading(trajectoire)
nbrebonds -= 1
print(nbrebonds)