检查点是否在一条直线上的函数

马泰奥干

我有一个点pos = (x, y)的坐标,我需要检查它是否是通过两个点p1 = (x1, y1), p2 = (x2, y2)的直线的一部分我使用的公式是 y - y1 = ((x - x1)/(x2 - x1)) * (y2 - y1),代码是:

        if pos[1] - p1[1] - 10 <= ((pos[0] - p1[0]) / (p2[0] - p1[0])) * (p2[1] - p1[1]) <= pos[1] - p1[1] + 10:
            return True

当我测试它时,我注意到斜率的直线是相反的。 图像

我通过检查画布的每个点(使用 tkinter)得到了这个:

    p1 = (313, 215)
    p2 = (92, 44)

    for x in range(0, 400):
        for y in range(0, 300):
            if y - p1[1] - 5 <= ((x - p1[0]) / (p2[0] - p1[0])) * (p2[1] - p1[1]) <= y - p1[1] + 5:
                canvas.create_oval(x, y, x, y)

最大的一条是上面等式所代表的线,手绘的就是我想要的。

我也尝试在 geogebra 上测试它,但一切正常......我错过了什么?

约翰科尔曼

您的数学似乎是正确的,问题是解释之一。

首先,你可以稍微简化一下数学:

x1,y1 = p1
x2,y2 = p2
m = (y2-y1)/(x2-x1)

def f(x): return y1 + m*(x-x1) 

def test(x,y,tol = 10):
    return abs(y-f(x)) <= tol

然后只需使用test(x,y)test(*pol)

问题是在画布坐标中,增加y实际上会让你在画布上向下移动。在您的样本数据-该线在这个意义上,线段连接画布点正确绘制(313, 215)(92,44) 一个递减线。

也许您想将点绘制为(x,300-y)而不是(x,y)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章