检查点是否位于线矢量上

时间:2018-01-28 15:40:42

标签: vector line point

要在r方向通过点p的线上获得另一个点(v),我们可以使用以下公式,并替换{{1}的任何值}:

r = p + a*v

要测试a是否在线,我们只能找到满足的r值。在我当前的实现中,我通过将a的等式重新组织为:

来检查向量的每个组成部分a是否相同

a = px - rx / vx

在代码术语中,如下所示:

r

但是,此方法不起作用:如果boolean isPointOnLine(Vector2f r, Vector2f p, Vector2f v) { return (p.x - r.x) / v.x == (p.y - r.y) / v.y; } 的任何组件为v,则该分数将评估为无穷大。因此我们得到了错误的结果。

如何正确检查0是否在线?

2 个答案:

答案 0 :(得分:1)

事实证明,我所拥有的等式实际上是正确的,除以0只是一个必须事先处理的边缘情况。最终函数如下所示:

boolean isPointOnLine(Vector2f r, Vector2f p, Vector2f v) {
    if (v.x == 0) {
        return r.x == p.x;
    }
    if (v.y == 0) {
        return r.y == p.y;
    }
    return (p.x - r.x) / v.x == (p.y - r.y) / v.y; 
}

答案 1 :(得分:0)

在3D 中,您可以执行以下操作:

如果点 r=(x,y,z) p=(px,py,pz) 在线上的另一个点并且 v=(vx,vy,vz) < / strong>方向计算以下

CROSS(v,r-p)=0

或按组件

(py-ry)*vz - (pz-rz)*vy==0
(pz-rz)*vx - (px-rx)*vz==0
(px-rx)*vy - (py-ry)*vx==0

对于 2D 版本,请将所有 z - 组件设为零

(px-rx)*vy - (py-ry)*vx == 0

不需要除法,没有边缘情况和简单的快速乘法。

当然,由于四舍五入,结果永远不会完全为零。所以你需要的是最小距离的公式,并检查距离是否在一定的公差范围内

d = ((px-rx)*vy-(py-ry)*vx)/sqrt(vx*vx+vy*vy) <= tol