【问题标题】:how to generate a triangulated mesh from multiple contour lines如何从多条轮廓线生成三角网格
【发布时间】:2019-09-13 04:39:55
【问题描述】:

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

我尝试使用 Poly2Tri 库进行 delaunay 三角剖分,但效果不佳,因为它只适用于 2d,虽然我可以让它在 3d 中工作,但它不能处理垂直堆叠的轮廓线(即:丢弃第 3 维时具有相同的坐标)

有谁知道哪种算法最适合使用,最好是我可以从 c# 应用程序中使用的现有库?

【问题讨论】:

  • 您可以使用 R 脚本(参见 r-project.org/about.html)并从 C# 应用程序控制脚本的执行(参见 stackoverflow.com/questions/4485943/…)。我自己不会那样做,但如果你想要一个学习 R 的理由......
  • 您的数据结构是否允许您使用以两条相邻轮廓线为界的条带?如果是,您可以逐条对表面条进行三角测量。另请参阅https://en.wikipedia.org/wiki/Triangle_strip
  • @HEKTO,我可以肯定地使用三条带,但这并没有定义生成合理镶嵌所需的索引的算法。
  • 这里的“指数”到底是什么?
  • @HEKTO 我不知道如何回答。我指的是生成的网格的三角形索引。给定这些轮廓线作为输入,我需要构建一个网格。问题是,使用什么算法来定义网格。网格是定义三角形的位置集合和索引集合。鉴于我已经有了等高线的位置,算法唯一需要输出的就是索引的集合。

标签: c# computational-geometry mesh surface triangulation


【解决方案1】:

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

假设轮廓线在 z 平面上按逆时针顺序被采样并存储为一组 (x,y,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 处的孔/边界点保持不变,但如果发生重叠,则不是向内移动,而是向外移动。最后,将所有三角形组合成一个网格。

【讨论】:

  • 谢谢@dchneric,我考虑过抵消重叠点,我想我希望有一个更量身定制的算法。但这可能是我最好的选择。我会试一试,谢谢您的意见。
  • @Hamish 添加偏移量只是将扩展的等高线图展平到二维空间以应用三角测量的一种方法。您也可以尝试其他映射方法。 3D 中的直接三角剖分也是可能的,只要您有一组采样点,并且您的数据结构可以回答“这 3 个点在曲面上形成有效三角形吗?”这个问题。然后,您可以通过选择离现有网格最近的未闭合点并将第一个有效点添加到其中来逐步构建三角形。
猜你喜欢
  • 2018-06-04
  • 1970-01-01
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
  • 2023-03-11
  • 2016-09-19
相关资源
最近更新 更多