如何连接两个平行的2d多边形以创建无缝的3D网格?
假设我有两个多边形,一个在另一个之上,就像这样:
我想连接它们的顶点,用它们周边的三角形创建一个三维网格。 此图显示了一种可能的方法(橙色线代表三角形边):
这种事情可以由人类直观地完成,但我在将其转化为工作算法时遇到了麻烦。
多边形存储为List
。 它们总是很简单,可能是凹的。
我会这样做:
-
在每个多边形中找到两个最近的点
这将用作起点
-
从这两个起始点重新排序顶点
具有相同的缠绕规则 ,例如像图像上的CW
-
找到每个多边形的“中心”点
例如所有顶点的平均值或边界框的中点或其他。 它不需要精确,但对于复杂的凹形,错误选择的中心位置将导致输出网格错误。
-
为每个顶点添加角度信息
角度很容易使用
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
顶点
现在加入:
-
连接最近的顶点
只处理所有绿色顶点并将它们连接到最近的蓝色顶点(图像上的黑线)
line(0,0) line(1,1) line(2,1) line(3,1) line(4,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次或更多次)
- 如果你想要安全,你应该将多边形切割成凸起的部分,并将它们单独进行细分,然后才能将网格连接在一起