gpt4 book ai didi

algorithm - python(tkinter)中直线和圆之间的碰撞检测

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:07:16 25 4
gpt4 key购买 nike

我编写了一个 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]

Diagram of circles

最佳答案

准确地说,我们不是在谈论线,而是在谈论线段。

我建议以下想法:

由于球在某个方向移动,唯一可能与某物发生碰撞的点位于 180° 弧线上 - 向前移动的部分。这意味着在检查碰撞的某个时间点时,您必须检查这些点中的任何一个是否与某物发生碰撞。检查的点越多,碰撞的时间精度越好,但复杂度越差。

检查碰撞:检查是否有任何点位于线段的两端之间。您可以通过首先检查坐标来做到这一点(示例是查看您画的线,意思是 A.x < B.xA.y > B.y)if (A.x <= point.x <= B.x && A.y >= point.y >= B.y如果条件满足,则检查这 3 个点是否形成一条线。因为你已经有了 A 的坐标和 B你可以推导出这条线的方程并检查是否point满足它。

简而言之:您检查 point 是否满足直线方程且在由2个点定义的矩形内。

如何获得必须检查的点数:假设2k+1是你想在某个时间检查的点数,C是你的中心r半径和 V运动矢量。那么方向向量左侧和右侧的点数将相等,为k。 (+1 点在圆和运动矢量的交点处)。然后 90° / k是一个角度划分。由于您知道运动矢量,因此可以计算它与水平线之间的角度(设为 angle )。您不断添加以向左移动并递减以从运动矢量向右移动 90° / k 的值。正是k次(让我们用 i 表示这个值)并计算 point 的位置通过 point.x = C.x + sin(i) * rpoint.y = C.y + cos(i) * r .

抱歉,我不懂 python。

关于algorithm - python(tkinter)中直线和圆之间的碰撞检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21197305/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com