计算3d中线段之间的垂直和角度距离

时间:2011-03-07 17:15:23

标签: c++ c math 3d geometry

我正在用C ++实现一个聚类算法。具体来说,这个算法:http://www.cs.uiuc.edu/~hanj/pdf/sigmod07_jglee.pdf

在算法的某一点(第3.2节第4-5页),我将计算两个线段之间的垂直和角距离(d┴和dθ):p1到p2,p1到p3。

自从我上了数学课以来已经有一段时间了,我对这些实际上是概念性的以及如何计算它们有点不稳定。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

请看第3页的图5.它绘制出d┴和dθ是什么。

编辑:“Lehmer mean”是使用Lp-space约定定义的。因此,在3维中,您将使用p = 3.假设两个起始点之间的(欧几里得)距离为d1,并且两端之间的距离为d2。然后是d┴(L1, L2) = (d1^3 + d2^3) / (d1^2 + d2^2)

要查找两个向量之间的角度,可以使用它们的dot product。标准(表示为||x||)计算为like this

答案 1 :(得分:1)

要获得点Q与由两个点P_1P_2定义的直线的垂直距离,请计算:

d = DOT(Q, CROSS(P_1, P_2) )/MAG(P_2 - P_1)

其中DOT是点积,CROSS是矢量叉积,MAG是幅度(sqrt(X*X+Y*Y+..)

使用图5.您计算d_1sj到行(si->ei)和d_2ej到同一行的距离的距离。

我会建立一个基于三个点的坐标系,两个(P_1P_2)用于一行,第三个Q用于其他线段。坐标系的三个轴可以这样定义:

e = UNIT(P_2 - P_1)      // axis along the line from P_1 to P_2
k = UNIT( CROSS(e, Q) )  // axis normal to plane defined by  P_1, P_2, Q
n = UNIT( CROSS(k, e) )  // axis normal to line towards Q

其中UNIT()是返回单位向量的函数(幅度= 1)。

然后,您可以使用简单的点积建立所有预计长度。因此,考虑图5中的行si-ei和点sj,长度为:

(l || 1) = DOT(e, sj-si);
(l |_ 1) = DOT(n, sj-si);
ps = si + e * (l || 1)      //projected point

在第二段ej结束时,需要计算新的坐标轴(ekn

(l || 2) = DOT(e, ei-ej);
(l |_ 1) = DOT(n, ej-ei);
pe = ei - e * (l || 1)      //projected point

最终角度距离是

(d th)  = ATAN( ((l |_ 2)-(L |_ 1))/MAG(pe-ps) )

PS。您可能希望在 Math.SO 发布此处,以便获得更好的答案。