剔除内部三角形

时间:2010-08-11 19:29:32

标签: language-agnostic geometry triangulation

我有数千个四边形阵列; 4面3D多边形。我所知道的是四角的坐标。

这些四边形的子集定义了3D形状的封闭外壳。其余的四边形位于这个封闭的固体内部。

如何确定哪些四边形是外壳的一部分以及哪些四边形是内部的一部分?这不是性能关键代码。


编辑:对外壳形状的进一步限制

  • 形状内没有洞,只有一个表面。
  • 它包含凸起和凹陷部分。
  • 我知道有几个点在shell的内部。

5 个答案:

答案 0 :(得分:4)

如果你的形状自相交,这可能很难实现,但是如果你能找到一个你知道的四边形在表面上(可能离质心最远的一个),那么在它周围绘制出同心圆的四边形。然后在那之外找到一个连续的四边形环,依此类推,直到你到达“对面”一侧。如果你的四边形相交或内部连接,那就更难了。我试着将那些交叉的那些分开,然后找到所有可能的光滑表面,并选择内部体积最大的那个。

答案 1 :(得分:2)

这个怎么样?

计算四边形的法向量(称之为'当前'四边形)。 与该向量和所有剩余的四边形进行交叉测试。 如果它与矢量正部分中的另一个四边形相交,则您知道当前四边形是内部四边形。重复所有剩余的四边形。

这假设四边形'面向'。

答案 2 :(得分:2)

如果形状是凸的,可以很容易地完成。当形状凹陷时,它会更难。

在凸形情况下,通过计算所有点的平均值来找到质心。这给出了以下属性所在的内部点:

  

如果投射四条光线   质心到四边形的每个角落   将金字塔定义为两部分,   一部分包含空间内部   形状和其他部分定义   可能在外面的空间   形状

这两个卷为您提供了一个决策过程,以检查四边形是否在边界上。如果来自另一个四边形的任何点出现在外部体积中,那么四边形不在边界上并且可以作为内部四边形被丢弃。

编辑:刚刚看到你的澄清。在较难的情况下,形状是凹的,那么你需要两件事之一;

  1. 可用于选择四边形的形状的描述(参数化),或
  2. 其他一些属性,例如所有边界四边形都是连续的
  3. 进一步编辑:刚刚意识到你所描述的将是一个凹陷的船体。尝试查看this search page中的一些结果。

答案 3 :(得分:2)

考虑到所有四边形都存在于一个大密封盒内。选一个四边形。做光线追踪;将四边形视为光源,并将所有其他四边形视为反射和模糊,其中四边形的命中将从该曲面向所有方向发送光,但不在角落周围。

如果在所有节点都有机会被击中后没有光线照射到外部盒子,请将该四边形视为内部。

如果它是凸的,或者内部四边形没有与外部四边形共享边缘,则有更简单的方法。

答案 4 :(得分:1)

您可以通过减少必须处理的四边形数量来简化问题。

你知道有些四边形是一个封闭的外壳。因此,这些四边形在它们的边缘处连接。如果四边形的三个相互相邻的边(即,边形成闭环)与另一个四边形的边重叠,那么这些四边形可能是壳的一部分(这些相互相邻的边用作2D区域的边界;让我们看看将该区域称为四边形的“连接面”。列出这些“shell候选者”。现在,查看此列表并抛弃任何具有不与另一个候选者重叠的边缘的候选者(即,边缘与不在列表中的四边形的边缘重叠)。重复此剔除过程,直到您无法再删除任何四边形。你剩下的应该是你的外壳。创建一个“非shell四边形”列表,其中包含不在“shell”列表中的所有四边形。

在此外壳周围绘制一个边界框(或球体,椭圆等)。现在,查看非shell四边形列表,并抛出任何位于边界区域的四边形。这些肯定不在内部。

取剩余的非贝壳四边形。这些可能或可能不在形状的内部。对于这些四边形中的每一个,从每个面的中心垂直于四边形绘制线,该边以在边界形状的表面上结束。跟踪每一行并计算线穿过shell列表中四边形的“连接面”的次数。如果此数字为奇数,则该顶点位于形状的内部。如果是偶数,则顶点在外部。您可以根据顶点是在内部还是外部来确定四边形是在内部还是外部。