将一个点投影到与多边形同一平面上。

3
我很难理解如何做到这一点。我有一个由三个点定义的多边形,也有一个在空间中的点。我想将空间中的点移动到与多边形相同的平面上。据我所知,如何做到这一点是众所周知的。但是,我不知道怎么做。
我找不到任何简单明了的算法或者坚实的解释。
我一直在看这个:http://www.odeion.org/pythagoras/pythag3d.html 但那样只能给我距离而不能给我顶点的坐标。我可以看出如果多边形仅限于2D,那会很有用,但在我的情况下,它可能具有任何方向。
不幸的是,我的数学水平相当弱,但我非常愿意学习。
1个回答

11
第一个有用的概念步骤是确定一个点是否与描述平面的多边形三个点在同一平面上。其中一种方法是计算平面的法向量——称之为n——并使用n和其中一个点(称该点为r0)定义平面。
计算平面的法向量可以通过多种方式完成(参见here)。对于这种情况,最方便的方法是取在平面内的两个向量的叉积(使用定义多边形的点找到两个向量)。
知道了n后,你可以通过n和向量(r0 - r)的点积来测试一个点r是否在平面上。更多解释请参见here
然后,您可以对任何点使用正交投影来获得一个新点,该新点位于平面上。

示例

假设我有三个点:

  • p1: [1, 1, 1]
  • p2: [1.5, 6, 3]
  • p3: [2, -1, 5].

首先创建一个法向量,该向量垂直于由这些点创建的平面。让

  • v1 = p1 - p2 = [-0.5, -5, -2]
  • v2 = p1 - p3 = [-1, 2, -4].

这两个向量的法向量是

  • n = v1 x v2 = [24, 0, -6].
为了方便起见,让我们规范化n,现在n = [0.9701425, 0, -0.24253563]。
现在我们通过n定义平面,并让r0 = p1
让我们引入一个不在平面上的新点r(您可以通过将n和(r0 - r)的点积来验证):
  • r = [4, 4, 4]

r移动到平面上的一种方法是沿着法向量"滑动"它,直到它位于平面上(这称为正交投影)。这是通过确定向量v3=(r0 - r)中有多少n(称为标量投影)来完成的。在这种情况下,标量投影产生新向量v3m= [-0.88235294,-3,-3.52941176]。这是通过计算v3 - n·dot(nv3)得出的。您可以验证它在平面上,因为它与n正交。

现在我们可以恢复点:

  • rm= r0 - v3m = [1.88235294,4,4.52941176]。

您可以验证此点确实在平面上:

  • 点(r0 - rm, n) = 0。

2
最好检查一下你的三个点是否不共线。否则非常好的答案! - santiagoIT
哇,谢谢你。我唯一遇到困难的地方是标量投影。据我所知,如果我取v3和n的叉积,我会得到一个大小。然后我该怎么做才能得到v3m呢? - gregghz
看起来你已经更新了你的答案。我会试一下。 - gregghz
好的评论santiagoIT,幸运的是,对于我的应用程序,我可以保证这些点不共线。然而,如果你想要一个通用解决方案,那么我认为你说得很对。 - gregghz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接