如何连接两个平行的2d多边形以创建无缝的3D网格?

假设我有两个多边形,一个在另一个之上,就像这样:

两个多边形

我想连接它们的顶点,用它们周边的三角形创建一个三维网格。 此图显示了一种可能的方法(橙色线代表三角形边):

两个多边形,用三角形连接

这种事情可以由人类直观地完成,但我在将其转化为工作算法时遇到了麻烦。

多边形存储为List 。 它们总是很简单,可能是凹的。

我会这样做:

  1. 在每个多边形中找到两个最近的点

    这将用作起点

  2. 从这两个起始点重新排序顶点

    具有相同的缠绕规则 ,例如像图像上的CW

  3. 找到每个多边形的“中心”点

    例如所有顶点的平均值或边界框的中点或其他。 它不需要精确,但对于复杂的凹形,错误选择的中心位置将导致输出网格错误。

  4. 为每个顶点添加角度信息

    角度很容易使用

     a=atan2(vertex-center) 

毕竟这应该是这样的:

多边形

角度角度[deg]

 index: 0 1 2 3 4 green: 355 085 135 170 230 blue: 020 135 255 

现在,您只需将两个最接近的顶点从一个多边形匹配到另一个多边形

不要忘记角度差是最大+/-180 deg ,如果你使用弧度,然后将常数180,360转换为PI,2.0*PI

 da=ang1-ang0; while (da<-180.0) da+=360.0; while (da>+180.0) da-=360.0; if (da<0.0) da=-da; 

对于下一个文本line(i,j)将表示来自蓝色多边形的绿色和第j-th顶点j-th顶点

现在加入:

  1. 连接最近的顶点

    只处理所有绿色顶点并将它们连接到最近的蓝色顶点(图像上的黑线)

     line(0,0) line(1,1) line(2,1) line(3,1) line(4,2) 
  2. 填补空洞

    网格三角剖分每个顶点至少需要2个节点,因此连接点较少的处理点:

      index: 0 1 2 3 4 green connections: 1 1 1 1 1 blue connections: 1 3 1 

    所以现在处理不到2次使用蓝色顶点(0,2)并将它们连接到最近的绿色顶点(图像上的黄线),忽略已经使用的连接(在这种情况下选择下一个)

     line(1,0) line(3,2) 

    所以:

      index: 0 1 2 3 4 green connections: 1 2 1 2 1 blue connections: 2 3 2 

    现在处理其余的绿色少于2次使用的顶点连接到不到3次使用蓝色顶点。 如果它有少于3个连接,则选择已经使用连接的下一个点,如果有多个选项,则使用最接近的选项(图像上的红线)。

line(0,2) green 0连接到蓝色0所以从蓝色1,2中选择(1也是如此2)
line(2,-) green 2连接到蓝色1,使用3次,因此忽略此顶点
line(4,-) green 4连接到蓝色2,使用3次,因此忽略此顶点

  index: 0 1 2 3 4 green connections: 2 2 1 2 1 blue connections: 2 3 3 

就是这一切。 现在你应该像这样完成这个问题:

啮合

[笔记]

  • 你也可以使用周长位置/周长而不是角度(有时它会有更好的结果)
  • 凹多边形可以搞砸了很多,所以应该添加一些三角形交叉检查以避免问题。
  • 在这种情况下,多边形之间的顶点数量也不应该相差太多,你仍然可以划分一些线来添加缺失点,否则3次使用条件将是错误的(如果顶点数相差2次或更多次)
  • 如果你想要安全,你应该将多边形切割成凸起的部分,并将它们单独进行细分,然后才能将网格连接在一起