如何检测三角网格中的孔?

时间:2012-10-19 06:23:18

标签: algorithm geometry

实际上,我可以通过检查三角形的哪个边缘没有任何邻居来检测凸三角形网格的边界或边缘。因此,如果网格有一些洞,那么我们可以很容易地突出显示该部分,因为我们有边缘顶点。

但问题是,如果我们只有边缘顶点或边界,我们怎么知道网格有一些洞?网格有多少孔?

我对这个问题想得够多,但无法得到它,任何想法?什么应该是孔检测的条件或检查?

检测到一个洞后,我想填补它。但首先要检测它吗?

感谢。

3 个答案:

答案 0 :(得分:2)

假设网格已连接,您可以突出显示所有边界。你留下了所有的洞+一个额外的边界,这是网格本身的边界。你可以丢弃最大长度的边界并获得所有的洞。

答案 1 :(得分:1)

来自扫描仪(例如Kinect)的三角形网格可以具有小碎片(孤立的贴片)以及小孔。我建议通常可以通过计算边界上与顶点相邻的顶点数来检测孔。如果相邻顶点的数量少于边界顶点,则不是一个洞。

答案 2 :(得分:0)

我的回答只适用于封闭的网格,但它会处理凹凸的情况。

为了便于解释,我们设想一个2D网格。

计算网格的边界框。在我们的示例中,边界框需要存储X轴和Y轴的最小值和最大值,以及每个值的相应顶点索引:

struct BoundingBox
{
  float minX,maxX,minY,maxY;
  int vminX,vmaxX,vminY,vmaxY;
}

迭代网格中的每个顶点,在添加每个点时增大边界框。当顶点负责更改其中一个最小值/最大值时,使用顶点网格索引存储或覆盖相应的vmin / vmax值。

E.g。

BoundingBox bounds;
bounds.minX = verts[0].X;
bounds.maxX = verts[0].X;
bounds.minY = verts[0].Y;
bounds.maxY = verts[0].Y;
bounds.vminX = bounds.vmaxX = bounds.vminY = bounds.vmaxY = 0;
for (int i = 1; i < numVerts; i++)
{
  Vertex v = verts[i];
  if (v.X < bounds.minX) { bounds.minX = v.X; bounds.vminX = i; }
  if (v.X > bounds.maxX) { bounds.maxX = v.X; bounds.vmaxX = i; }
  if (v.Y < bounds.minY) { bounds.minY = v.Y; bounds.vminY = i; }
  if (v.Y > bounds.maxY) { bounds.maxY = v.Y; bounds.vmaxY = i; }
}

现在迭代你的边界,直到找到一个包含你在边界框中收集的所有顶点的边界。这是你的外边界。剩下的边界是网格内的洞。