如何从多条轮廓线生成三角网格

时间:2019-04-23 23:18:16

标签: c# computational-geometry mesh surface triangulation

我需要在两条或更多3d等高线之间生成一个三角网格。等高线只是点的数组,并且总是封闭的。

Example contour lines

我尝试使用Poly2Tri库进行delaunay三角剖分,但这并不能很好地工作,因为它仅在2d中有效,尽管我可以使其在3d中正常工作,但它不能处理垂直堆叠的轮廓线(即:丢弃第3维时具有相同的坐标)

有人知道哪种算法最适合使用,理想情况下可以从c#应用程序中使用的现有库吗?

1 个答案:

答案 0 :(得分:1)

您可以继续使用2D Delaunay算法,但是每次都在两个相邻层(z1,z2)之间进行。 (z1

假设轮廓线被采样并以一组(x,y,z)在z平面上以逆时针顺序存储。您需要构造一组边界/孔点进行三角测量:

  • 检测或计算重叠的线段(x1,y1,z1)(x2,y2,z1)和(x1,y1,z2)(x2,y2,z2)
  • 沿两个相邻线段的平均法线方向向内移动(x1,y1,z1)一个小偏移量。同样,向内移动(x2,y2,z1);向外移动(x1,y1,z2)(x2,y2,z2)。现在将两条(或更多条)轮廓线分开,您将获得两个(或更多条)边界/孔点集。
  • 在边界和孔定义的区域内应用Delaunay三角剖分(即生成随机点,边界外或孔内的下降点,构造三角形)。我假设Poly2Tri将处理三角形部分覆盖孔的情况。在(x,y)平面中拥有所有三角形后,请还原偏移并通过插值原始数据来计算z。

再次对(z2,z3)层进行三角剖分,依此类推。请注意,z2处的孔/边界点保持不变,但是如果发生重叠,则它向内移动而不是向内移动。最后,将所有三角形合并为一个网格。