【发布时间】:2011-07-10 12:23:11
【问题描述】:
我正在用 C++ 实现一个聚类算法。具体来说,这个算法:http://www.cs.uiuc.edu/~hanj/pdf/sigmod07_jglee.pdf
在算法中的某一点(第 3.2 节 p4-5),我要计算两条线段之间的垂直距离和角距离(d┴ 和 dθ):p1 到 p2,p1 到 p3。
自从我上数学课以来已经有一段时间了,我对这些实际上是什么概念以及如何计算它们有点动摇。有人可以帮忙吗?
【问题讨论】:
我正在用 C++ 实现一个聚类算法。具体来说,这个算法:http://www.cs.uiuc.edu/~hanj/pdf/sigmod07_jglee.pdf
在算法中的某一点(第 3.2 节 p4-5),我要计算两条线段之间的垂直距离和角距离(d┴ 和 dθ):p1 到 p2,p1 到 p3。
自从我上数学课以来已经有一段时间了,我对这些实际上是什么概念以及如何计算它们有点动摇。有人可以帮忙吗?
【问题讨论】:
要获得点 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 上发布此内容,以便获得更好的答案。
【讨论】:
请看第 3 页的图 5。它画出了 d┴ 和 dθ 是什么。
编辑:“Lehmer 均值”是使用 Lp-space 约定定义的。因此,在 3 维中,您将使用 p = 3。假设两个起点之间的(欧几里德)距离为 d1,而终点之间的距离为 d2。然后d┴(L1, L2) = (d1^3 + d2^3) / (d1^2 + d2^2)。
要找到两个向量之间的角度,可以使用它们的dot product。范数(表示为||x||)计算为like this。
【讨论】: