检查点是否在线向量上

Cam*_*ell 4 point vector line

要在 方向上r通过点的直线上获得另一个点 ( ) ,我们可以使用以下公式,并将 替换为任意值:pva

r = p + a*v

要测试是否r在线,我们只需找到一个a满足的值即可。在我当前的实现中,我a通过重新组织方程来检查向量的每个分量是否相同r

a = px - rx / vx

在代码方面,这看起来如下:

boolean isPointOnLine(Vector2f r, Vector2f p, Vector2f v) {
    return (p.x - r.x) / v.x == (p.y - r.y) / v.y; 
}
Run Code Online (Sandbox Code Playgroud)

但是,此方法不起作用:如果 的任何分量v0,则该分数将计算为无穷大。因此我们得到了不正确的结果。

如何检查r线路是否正确?

ja7*_*a72 5

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

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

CROSS(v,r-p)=0
Run Code Online (Sandbox Code Playgroud)

或按组件

(py-ry)*vz - (pz-rz)*vy==0
(pz-rz)*vx - (px-rx)*vz==0
(px-rx)*vy - (py-ry)*vx==0
Run Code Online (Sandbox Code Playgroud)

对于2D版本,将所有z分量设置为零

(px-rx)*vy - (py-ry)*vx == 0
Run Code Online (Sandbox Code Playgroud)

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

当然,由于四舍五入,结果永远不会恰好为零。因此,您需要的是最小距离的公式,并检查距离是否在某个公差范围内

d = abs((px-rx)*vy-(py-ry)*vx)/sqrt(vx*vx+vy*vy) <= tol
Run Code Online (Sandbox Code Playgroud)