我正在用C ++实现一个聚类算法。具体来说,这个算法:http://www.cs.uiuc.edu/~hanj/pdf/sigmod07_jglee.pdf
在算法的某一点(第3.2节第4-5页),我将计算两个线段之间的垂直和角距离(d┴和dθ):p1到p2,p1到p3。
自从我上了数学课以来已经有一段时间了,我对这些实际上是概念性的以及如何计算它们有点不稳定。有人可以帮忙吗?
答案 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_1
和P_2
定义的直线的垂直距离,请计算:
d = DOT(Q, CROSS(P_1, P_2) )/MAG(P_2 - P_1)
其中DOT
是点积,CROSS
是矢量叉积,MAG
是幅度(sqrt(X*X+Y*Y+..)
)
使用图5.您计算d_1
从sj
到行(si->ei
)和d_2
到ej
到同一行的距离的距离。
我会建立一个基于三个点的坐标系,两个(P_1
,P_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
结束时,需要计算新的坐标轴(e
,k
,n
)
(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 发布此处,以便获得更好的答案。