要在r
方向通过点p
的线上获得另一个点(v
),我们可以使用以下公式,并替换{{1}的任何值}:
要测试a
是否在线,我们只能找到满足的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;
}
的任何组件为v
,则该分数将评估为无穷大。因此我们得到了错误的结果。
如何正确检查0
是否在线?
答案 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