检查点是否在直线矢量上

坎贝尔

得到另一个点(r)在穿过点通过线p的方向上v,我们可以使用下面的公式,以及用于替换任何值a

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

但是,此方法不起作用:如果vis的任何组成部分0,则分数将取无穷大。因此,我们得到一个错误的结果。

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

约翰·阿列克修

在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 = ((px-rx)*vy-(py-ry)*vx)/sqrt(vx*vx+vy*vy) <= tol

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章