【发布时间】:2014-04-02 11:19:52
【问题描述】:
在 3 个维度中有一个点数组。 1 = {x,y,z}; 2 = {x,y,z}; 3 = {x,y,z}, ... n = {x,y,z}。我们也有一点t = {x,y,z}。
如何在点 t 周围发现形成四面体的 4 个点?
【问题讨论】:
在 3 个维度中有一个点数组。 1 = {x,y,z}; 2 = {x,y,z}; 3 = {x,y,z}, ... n = {x,y,z}。我们也有一点t = {x,y,z}。
如何在点 t 周围发现形成四面体的 4 个点?
【问题讨论】:
将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 是上面概述的行列式计算。
【讨论】:
ccw。这让我想到了voronoi.com/wiki/index.php?title=Vector_Algebra_%26_Geometry 也涵盖了 3d。
@MvG 略有不同。将Hesse normal form 用于曲面n⋅r−d=0,其中n 是单位法线r 是曲面上的一个点,d 是该点到曲面的距离。给定曲面上的三个点p1、p2、p3,法线是
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 和第 4 个点的符号,如 MvG 的解决方案。事实上,如果你做代数,它应该是相同的测试。
一个可能值得预先计算的优化是 t 的 x 坐标不能小于其他点的最小 x 坐标。类似于 x、y 和 z 的最大值和最小值。这可能会节省很多乘法。
【讨论】:
只是一个粗略的想法 - 有问题的四个点必须与t 具有相同的距离,并且必须成对在相同的 109.5° 角度;不过在代码中可能有点繁琐。
【讨论】:
t 中不需要正则四面体居中,而是任何带有角的四面体选自包含t 的给定集合。虽然他说的不是很清楚。