要在 方向上r通过点的直线上获得另一个点 ( ) ,我们可以使用以下公式,并将 替换为任意值:pva
要测试是否r在线,我们只需找到一个a满足的值即可。在我当前的实现中,我a通过重新组织方程来检查向量的每个分量是否相同r:
在代码方面,这看起来如下:
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)
但是,此方法不起作用:如果 的任何分量v是0,则该分数将计算为无穷大。因此我们得到了不正确的结果。
如何检查r线路是否正确?
在 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)