我编写了一个python程序,其中一个圆圈从用户绘制的线条反弹。有多个圆圈从墙上反弹。对于每一个,应计算距圆心和球的最短距离。我更喜欢这个代码是非常有效的,因为我目前的算法经常落后于计算机。如果a点是起点,点b是终点,点c是中心,r是半径,我如何计算球之间的最短距离?如果球的X坐标超出了段AB中的x坐标范围,该算法也应该有效。
请发布python代码
任何帮助将不胜感激!
这是我到目前为止所拥有的:
lineList是一个包含4个值的列表,其中包含用户绘制的行的开始和结束坐标
中心是球的中心
global lineList, numobjects
if not(0 in lineList):
beginCoord = [lineList[0],lineList[1]]
endCoord = [lineList[2]-500,lineList[3]-500]
center = [xCoordinate[i],yCoordinate[i]+15]
distance1 = math.sqrt((lineList[1] - center[1])**2 + (lineList[0] - center[0])**2)
slope1 = math.tan((lineList[1] - lineList[3]) / (lineList[0] - lineList[2]))
try:
slope2 = math.tan((center[1] - beginCoord[1])/(center[0]-beginCoord[0]))
angle1 = slope2 + slope1
circleDistance = distance1 * math.sin(angle1)
except:
#If the circle is directly above beginCoord
circleDistance = center[1] - lineList[1]
global numbounces
if circleDistance < 2 and circleDistance > -2:
print(circleDistance)
b = False
b2=False
if xCoordinate[i] < 0:
xCoordinate[i] += 1
speed1[i] *= -1
b=True
elif xCoordinate[i] > 0:
xCoordinate[i] -= 1
speed1[i] *= -1
b=True
if yCoordinate[i] < 0:
yCoordinate[i] += 1
speed2[i] *= -1
b2=True
elif yCoordinate[i] > 0:
yCoordinate[i] -= 1
speed2[i] *= -1
b2=True
if b and b2:
#Only delete the line if the ball reversed directions
numbounces += 1
#Add a ball after 5 bounces
if numbounces % 5 == 0 and numbounces != 0:
numobjects = 1
getData(numobjects)
canvas.delete("line")
lineList = [0,0,0,0]
答案 0 :(得分:1)
为了正确起见,我们不是在谈论线条,而是在谈论细分市场。
我会建议以下想法:
由于球在某个方向上移动,唯一可能与某些物体发生碰撞的点位于180°弧线上 - 向前移动的部分。在检查碰撞的某个时间点的含义,你必须检查这些点中的任何一个是否与某些东西相撞。您检查的点越多,碰撞的精度越高,但复杂性越差。
检查碰撞:检查是否有任何点位于段的极值之间。您可以通过首先检查坐标来执行此操作(示例是查看您的绘制线,意味着 Ax&lt; Bx 和 Ay&gt; By )if (A.x <= point.x <= B.x && A.y >= point.y >= B.y
条件满足,你检查3点是否形成一条线。由于您已经有A
和B
的坐标,因此您可以推导出该线的等式并检查point
是否满足它。
简而言之:您检查point
是否满足线的等式并且位于由2个点定义的矩形内。
如何获得必须检查的积分:假设2k+1
是您希望在某个时间检查的积分数,C
是您的中心r
半径和{{ 1}}运动的矢量。然后,从方向矢量的左侧和右侧的点的数量将是相等的并且是V
(在圆与运动矢量的交点处的+1点)。然后k
是一个角度划分。由于您知道运动矢量,因此可以计算它与水平线之间的角度(让它为90° / k
)。你继续添加向左移动并递减以从运动向量向右移动angle
的值恰好90° / k
次(让我们用k
表示该值)并计算{的位置{1}} i
和point
。
Sry,我不知道python。
答案 1 :(得分:0)