在某个点附近找到形成四面体的4个点

时间:2014-04-02 11:19:53

标签: c# c++ math geometry

三维中有一系列点。 1 = {x,y,z}; 2 = {x,y,z}; 3 = {x,y,z}, ... n = {x,y,z}。我们还有一个点t = {x,y,z}。 如何在点t周围找到形成四面体的4个点?

3 个答案:

答案 0 :(得分:2)

1附加到您的所有坐标,有效地将它们转换为齐次坐标。然后由四个这样的坐标向量形成的矩阵行列式的符号告诉您所得到的四面体的方向。或者换句话说,如果你固定三个点并插入各种向量作为第四个,结果符号将告诉你第四个点是否高于前三个跨越的平面。

现在您可以根据此构建算法。首先选择三个积分。然后第四个点是有效坐标,只有它位于前三个跨越的平面的同一侧t。将符号相乘,如果结果为正,则可以继续。检查得到的四面体的其他三个边,如果t在所有四个中,你就完成了。你可以编码这个,例如像这样:

for i1 from 1 to n:
  for i2 from i1 + 1 to n:
    for i3 from i2 + 1 to n:
      for i4 from i3 + 1 to n:
        o = orient(i1, i2, i3, i4)
        if (orient(i1, i2, i3, t)*o > 0 and orient(i1, i2, t, i4)*o > 0 and
            orient(i1, t, i3, i4)*o > 0 and orient(t, i2, i3, i4)*o > 0):
          solution(i1, i2, i3, i4)

这里的函数orient是上面概述的决定性计算。

答案 1 :(得分:1)

@MvG略有不同。将Hesse normal form用于表面n⋅r−d=0,其中n是单位法线r是表面上的点,d是指点到表面的距离。给定表面上的三个点p1p2p3正常

n = (p2-p1) ^ (p3-p1)

其中^是交叉产品。这不是单位长度,但并不重要。我们可以通过计算

来测试目标点q是否在表面上
n . q  - n . p1

如果它为零,那么q在表面上,否则符号决定了你所在表面的哪一侧。注意n . q只是Triple product (a ^ b) . q,表示为行列式。所以我们的测试是

三重(p2 - p1,p3 - p1,q) - 三重(p2 - p1,p3 - p1,p1)。

对每个三个点进行此操作,并比较四面体中t和t点的符号,如MvG的解决方案。事实上,如果你确定了代数,它应该是相同的测试。

可能值得计算的优化是t的x坐标不能小于其他点的x坐标。类似于x,y和z的max和min。这可能会节省大量的乘法。

答案 2 :(得分:0)

只是一个粗略的想法 - 所讨论的四个点必须与t具有相同的距离,并且必须在109.5°的相同角度内成对;虽然在代码中可能有点狡猾。