检查一个点是否在一条向量上

3
为了在通过点p并朝向v的直线上取得另一个点r,我们可以使用以下公式,并为a替换任何值:
r = p + a*v
为了测试r是否在该直线上,我们只需要找到一个满足条件的a值。在我的当前实现中,我通过重新组织r的方程来检查每个向量分量的a值是否相同:
a = (px - rx) / vx = (py - ry) / vy
在代码方面,这看起来像下面这样:
boolean isPointOnLine(Vector2f r, Vector2f p, Vector2f v) {
    return (p.x - r.x) / v.x == (p.y - r.y) / v.y; 
}

然而,这种方法行不通:如果v的任何一个分量为0,那么这个分数将被计算为无穷大。因此我们得到了一个不正确的结果。
我如何正确检查r是否在直线上?
2个回答

4
在3D中,您需要执行以下操作:
如果点r=(x,y,z)在与线上的另一点p=(px,py,pz)和方向v=(vx,vy,vz)的直线上,则计算以下内容。
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 = abs((px-rx)*vy-(py-ry)*vx)/sqrt(vx*vx+vy*vy) <= tol

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; 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接