【问题标题】:Projecting a point onto the same plane as a polygon将点投影到与多边形相同的平面上
【发布时间】:2012-01-16 21:36:41
【问题描述】:

我无法理解如何执行此操作。我有一个由三个点定义的多边形。我在太空的某个地方也有一点。我想将点移动到空间中的某个位置,使其与多边形位于同一平面上。据我了解,如何做到这一点是众所周知的。但是,我并不熟悉。

我找不到任何直接的算法或可靠的解释来说明这是如何完成的。

我一直在看这个:http://www.odeion.org/pythagoras/pythag3d.html

但这会给我到顶点的距离而不是顶点。如果多边形限制为 2d,我可以看到这将是多么有用,但在我的情况下,它可能有任何方向。

不幸的是,我的数学很弱,但我非常愿意学习。

【问题讨论】:

    标签: 3d geometry


    【解决方案1】:

    第一个有用的概念步骤是确定一个点是否与多边形中描述该平面的三个点位于同一平面上。一种方法是计算平面的法线向量——称之为 n——并使用 n 和三个点之一定义平面(称之为点r0)。

    可以通过多种方式计算平面的法线向量(请参阅here)。对于这种情况,最方便的方法是在平面内的两个向量之间进行叉积(使用定义多边形中的点找到两个向量)。

    一旦你知道了n,你就可以用n和向量之间的点积来测试一个点r是否在平面上(r0 - 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 em>。

    让我们引入一个不在平面内的新点 r(您可以通过取 n 和 (r0 - r):

    • r = [4, 4, 4]

    r“移动”到平面上的一种方法是将其沿法线向量“滑动”直到它位于平面上(这是正交投影)。这是通过确定有多少 n 在向量 v3 = (r0 - r)(称为scalar projection)。在这种情况下,标量投影产生新的向量 v3m = [-0.88235294, -3, -3.52941176]。这是由 v3 - n*dot(n, v3)。您可以验证它是否在平面内,因为它与 n 正交。

    我们现在可以恢复重点了:

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

    你可以验证这个点确实在平面上:

    • dot(r0 - rm, n) = 0 .

    【讨论】:

    • 最好检查您的三个点是否不共线。否则很好的答案!
    • 哇,谢谢。我唯一遇到的问题是标量投影。据我所知,如果我取 v3 和 n 的叉积,我会得到一个量级。那我该怎么做才能获得 v3m?
    • 看来您已经更新了答案。我试试看。
    • 好评论 santiagoIT,幸运的是,对于我的应用程序,我可以保证这些点不是共线的。但是,如果您想要一个通用的解决方案,那么我认为您是正确的。
    猜你喜欢
    • 1970-01-01
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 2018-06-13
    相关资源
    最近更新 更多