【问题标题】:calculating perpendicular and angular distance between line segments in 3d计算 3d 中线段之间的垂直距离和角距离
【发布时间】: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++ c math 3d geometry


【解决方案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的结束,需要计算新的坐标轴(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 上发布此内容,以便获得更好的答案。

【讨论】:

  • 这不是我真正要求的。我不是在寻找点和线段之间的垂直距离,而是在两条线段之间。但我会看看 Math.SO,谢谢。
  • 两条线段不一定要在一个平面上来推导垂直距离。我在上面给了你一个算法来计算论文图 5 中的所有这些值,但我猜你并没有真正遵循上面的逻辑。恕我直言,您需要很好地掌握 3D 几何来处理这样的项目。
  • 我猜是 math.SE 而不是 math.SO - math.stackexchange.com。抱歉溢出太多了!
【解决方案2】:

请看第 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

【讨论】:

  • 好吧,它谈到了 d 维,但它以非常模糊的术语定义了 lehmer 均值,并且它没有给出确定两条线段之间角度的真正可辨别的方法。我想它可以用一些三角函数来完成,但我不太知道如何将其推断为 3d。
  • @basil:我已经试着澄清了,如果你还有问题,请告诉我。
  • 谢谢。我想我在概念上有点掌握它。我现在正在研究如何计算欧几里得距离。如果您对如何做到这一点有任何参考,那就太好了。自从我学习线性代数以来已经有 10 年了,而且这些东西回来的速度非常缓慢。
  • @basil:见wikipedia。 “欧几里得距离”就是别人所说的“距离”。
猜你喜欢
  • 2010-10-12
  • 2021-08-19
  • 2015-08-16
  • 2013-07-17
  • 1970-01-01
  • 2018-11-06
  • 1970-01-01
  • 1970-01-01
  • 2014-01-28
相关资源
最近更新 更多