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

时间:2014-07-31 22:49:17

标签: c# algorithm polygon

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

Two polygons

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

Two polygons, connected with triangles

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

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

1 个答案:

答案 0 :(得分:4)

我会这样做:

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

    这将用作起点

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

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

  3. 找到&#39; center&#39;每个多边形的点

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

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

    角度很容易使用

    a=atan2(vertex-center)
    
  5. 毕竟这应该是这样的:

    polygons

    用于角度角度[度]

    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)

    将表示来自绿色的i-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个连接,则选择已经使用连接的下一个点,如果有多个选项,则使用最接近的选项(图像上的红线)。


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

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

      就是这一切。现在你应该完成这样的细分:

      mesh

      <强> [注释]

      • 您还可以使用周长位置/周长而不是角度(有时候会有更好的效果)
      • 凹面多边形可能会弄乱这一点,因此应该添加一些三角形相交检查以避免出现问题。
      • 此外,多边形之间的顶点数量不应相差太多,在这种情况下,您仍然可以划分一些线条以添加缺失点,否则3次使用条件将是错误的(如果顶点数量相差2次或更多次)
      • 如果你想要安全,你应该将多边形切割成凸起的部分并单独测试它们,然后才能将网格连接在一起