如何找到具有1/0斜率截距的圆和线的点

时间:2013-09-23 16:38:34

标签: python-3.x geometry quadratic

我正在使用tkinter在Python 3中编写一个简单的2D自顶向下游戏。所有可碰撞的对象都是圆/弧或线。我编写了以下方法来检测圆圈何时到达一条线:

我使用公式y = mx + b和r ^ 2 =(x-h)^ 2 +(y-k)^ 2

def CheckHitCToL(self, LX0, LY0, LX1, LY1, CX0, CX1, Tab):
    try:
        H = self.Creatures[Tab].X
        K = self.Creatures[Tab].Y
        R = abs((CX0 - CX1) / 2)
        M = (LY0 - LY1) / (LX0 - LX1)
        B = M * (-LX1) + LY1
        QA = (M * M) + 1
        QB = (-H - H) + (((B - K) * M) * 2)
        QC = (H * H) + ((B - K) * (B - K)) - (R * R)
        X = (- QB + sqrt((QB * QB) - (4 * QA * QC))) / (2 * QA)
        Y = (M * X) + B
        if ((X <= LX0 and X >= LX1) or (X >= LX0 and X <= LX1)) and ((Y <= LY0 and Y >= LY1) or (Y >= LY0 and Y <= LY1)):
            return True
        else:
            return False
    except:
        return False

我的问题是当你有一条垂直线时,M(或斜率)是(LY0 - LY1)/ 0.(这是因为斜率等于上升/下降,而垂直线没有一个运行,只是一个上升)当然会返回一个错误,由try尝试除外,然后通知我的运动方法没有发生碰撞。当然我可以简单地移动&#34;尝试:&#34;几行,但它仍然会抛出错误。如何使用此程序在使用垂直线时不会抛出错误?

2 个答案:

答案 0 :(得分:0)

嗯,最明显的方法是使用if((LX0 - LX1)== 0)并单独执行此操作。在这种情况下,您需要检查LX0和CX0之间的距离是否等于圆的半径。

答案 1 :(得分:0)

您可以使用其他形式的线方程 -

隐式A*x + B*y + C = 0

或参数化x = LX0 + t * (LX1 - LX0), y = LY0 + t *(LY1 - LY0)

适当修改计算