计算几何,四面体符号体积

时间:2010-07-12 16:18:31

标签: math geometry

我不确定这是否是正确的地方,但这里有......

短版本:我正在尝试计算平面上三角形的方向,由三条边的交点形成,而不显式计算交点。

长版本:我需要在3D三角形上对三角形上的PSLG进行三角测量。 PSLG的顶点由线段与穿过三角形的平面的交点定义,并保证位于三角形内。假设我有交点,我可以投影到2D并使用点线侧(或三角形有符号区域)测试来确定任意3个交点之间三角形的方向。

问题是我无法明确计算交点,因为当我找到线平面交点时会累积浮点误差。为了弄清楚线段是否在第一个位置撞击三角形,我使用了一些可自由使用的强大几何谓词,它给出了四面体体积的符号,或等效于点位于平面的哪一侧。我可以确定线段端点是否位于通过三角形的平面的相对侧,然后在线段和三角形的每个边之间形成四面体,以确定交叉点是否位于三角形内。

由于我无法明确计算交点,我想知道是否有办法仅使用原始点在3D中表达相同的2D方向计算。如果有三条边撞击三角形,总共给我9分。假设我所要求的甚至是可能的(仅使用3D方向测试),那么我猜我需要在这9个点之间形成所有可能的四面体的一些子集。我甚至难以想象这一点,更不用说将其提炼成公式或代码了。我甚至不能谷歌,因为我不知道这类问题的行业标准术语是什么。

任何想法如何继续这个?谢谢。也许我应该问MathOverflow ......

编辑:在阅读了一些评论之后,我发生了一件事......也许如果我能在3个线段之间拟合非重叠的四面体,那么任何一个穿过这个平面的方向都将是我正在寻找的答案。除了边缘包围一个简单的三角形棱镜,我不确定这个子问题是否也可以解决。

编辑:请求的图像。 alt text

4 个答案:

答案 0 :(得分:6)

我在MO&所以,扩大我对MO的评论。

我的感觉是,没有带有签名四面体体积的计算技巧可以避免主要关注的精度问题。这是因为,如果您有紧密扭曲的线段,三角形的方向取决于切割平面的精确定位。
[图像删除;见下文] 在上面的示例中,上面的平面按顺序( a,b,c )[从上面的ccw]穿过线段:( 红色,蓝色,绿色),而下平面以相反的顺序交叉( c,b,a ):( 绿色,蓝色,红色)。高度 切割面的大小可以由你的最后一点精度确定。

因此,我认为继续计算交叉点是有意义的 切割平面,使用足够的精度使计算精确。如果您的段端点坐标和平面系数具有 L 精度位,那么只需要一个小的常数因子增加。虽然我不确定究竟是什么因素,但它很小 - 也许是4.你不需要例如 L 2 位,因为计算是求解线性的方程。 因此,精确计算所需的精度不会出现爆炸性增长。

祝你好运!

(由于我没有声誉,我被禁止发布澄清图片。见 相反,MO answer。)

编辑:看到MO回答,但这是图片:

Image

答案 1 :(得分:1)

我会用点和叉积来编写符号向量方程,以找到交叉三角形的法线。然后,该法线的点积与初始三角形1的符号给出方向。所以最后你可以用表格符号(F(p1,...,p9))来表达这一点,其中p1到p9是你的点,而F()是一个丑陋的公式,包括差异的点和叉积(pi-pj) 。不知道这是否可以更简单,但这种一般方法可以完成这项工作。

答案 2 :(得分:1)

据我了解,你有三条与平面相交的线,你想要计算交点形成的三角形的方向,而不是自己计算交点吗?

如果是这样的话:你有一架飞机

N·(x - x0) = 0

和六点......

l1a, l1b, l2a, l2b, l3a, l3b

......形成三条线

l1 = l1a + t(l1b - l1a)
l2 = l2a + u(l2b - l2a)
l3 = l3a + v(l3b - l3a)

这些线与平面的交点出现在t,u,v的特定值,我将其称为t i ,u i ,v <子> I

N·(l1a + ti(l1b - l1a) - x0) = 0

      N·(x0 - l1a)
ti =  ----------------
      N·(l1b - l1a)
(similarly for ui, vi)

然后具体的交点是

intersect1 = l1a + ti(l1b - l1a)
intersect2 = l2a + ui(l2b - l2a)
intersect3 = l3a + vi(l3b - l3a)

最后,三角形的方向是

orientation = direction of (intersect2 - intersect1)x(intersect3 - intersect1)

(x是交叉产品)向后插入值,你将得到一个仅基于N,x 0 和你的六个方向的方程式分。

答案 3 :(得分:1)

让我们调用您的三角形顶点T[0]T[1]T[2],第一个线段的端点为L[0]L[1],第二个是{{ 1}}和L[2],第三个是L[3]L[4]。我想你想要一个功能

L[5]

如果交点与三角形具有相同的方向,则返回1,否则返回-1。 在int Orient(Pt3 T[3], Pt3 L[6]); // index L by L[2*i+j], i=0..2, j=0..1 值的交换下,结果应该是对称的,在j值和i索引的交换下是反对称的。只要你能用这些对称来计算数量,那就是你所需要的。

我们试试

T

其中产品应该取代指数的循环排列(模3)。我相信这具有所需的所有对称属性。 Sign(Product( Orient3D(T[i],T[i+1],L[2*i+0],L[2*i+1]) * -Orient3D(T[i],T[i+1],L[2*i+1],L[2*i+0]) ), i=0..2)) 是Shewchuk的4点平面定向测试,我假设你正在使用它。