python中线与圆之间的碰撞检测(tkinter)

时间:2014-01-17 22:40:13

标签: algorithm math python-3.x tkinter collision-detection

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

2 个答案:

答案 0 :(得分:1)

为了正确起见,我们不是在谈论线条,而是在谈论细分市场。

我会建议以下想法:

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

检查碰撞:检查是否有任何点位于段的极值之间。您可以通过首先检查坐标来执行此操作(示例是查看您的绘制线,意味着 Ax&lt; Bx Ay&gt; By if (A.x <= point.x <= B.x && A.y >= point.y >= B.y条件满足,你检查3点是否形成一条线。由于您已经有AB的坐标,因此您可以推导出该线的等式并检查point是否满足它。

简而言之:您检查point是否满足线的等式并且位于由2个点定义的矩形内。

如何获得必须检查的积分:假设2k+1是您希望在某个时间检查的积分数,C是您的中心r半径和{{ 1}}运动的矢量。然后,从方向矢量的左侧和右侧的点的数量将是相等的并且是V(在圆与运动矢量的交点处的+1点)。然后k是一个角度划分。由于您知道运动矢量,因此可以计算它与水平线之间的角度(让它为90° / k)。你继续添加向左移动并递减以从运动向量向右移动angle的值恰好90° / k次(让我们用k表示该值)并计算{的位置{1}} ipoint

Sry,我不知道python。

答案 1 :(得分:0)

从圆到线的最短距离是从中心到该线的最短距离,减去圆的半径。如果从中心到线的距离小于半径,则线穿过圆圈。

许多地方都会记录从点到线的距离,包括here

很抱歉没有发布Python代码,但它非常基本。