我有一些零散的3D点(2d解决方案就足够了)。我希望找到不同的直线(至少有三个线构成线)放在附近(例如10个单位)。单点可以是不同线的一部分。
答案 0 :(得分:2)
要确定3个点(a,b,c)是否在一行中,请使用交叉积(2D或3D):
V = (Vx, Vy, Vz)
Vab = b - a
Vac = c - a
CrossProd (V,W) = (VyWz - VzWy, VzWx - WzVx, VxWy - WxVy)
如果CrossProd(Vab, Vac)
为零,则点(a, b, c)
为共线点。实际上,叉积与三角形(a, b ,c)
的面积成正比,因此如果需要,您可以设置一个小的非零容差。
重新。耐受性。
从b
到第Vac
行的距离由下式给出:
d = length(CrossProd(Vab, Vac))/ length(Vac)
您可以根据问题描述将其与绝对容差进行比较。或者,您可以使用:
sin(theta) = length(CrossProd(Vab, Vac))/ length(Vac)/ length(Vab)
然后theta
是两个向量之间的角度,可以与固定的公差进行比较。