假设我有两个多边形,一个在另一个之上,就像这样:
我想连接它们的顶点,用它们周边的三角形创建一个三维网格。此图显示了一种可能的方法(橙色线代表三角形边):
这种事情可以由人类直观地完成,但我在将其转化为工作算法方面遇到了麻烦。
多边形存储为List<Vector2>
。它们总是很简单,可能是凹的。
答案 0 :(得分:4)
我会这样做:
在每个多边形中找到两个最近的点
这将用作起点
从这两个起点重新排序顶点
具有相同的缠绕规则,例如 CW ,如图像
找到&#39; center&#39;每个多边形的点
例如所有顶点的平均值或边界框的中点或其他。它不需要精确,但在复杂的凹形上错误选择中心位置会导致输出网格出错。
为每个顶点添加角度信息
角度很容易使用
a=atan2(vertex-center)
毕竟这应该是这样的:
用于角度角度[度]
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
顶点
现在加入:
加入最近的顶点
只处理所有绿色顶点并将它们连接到最近的蓝色顶点(图像上的黑线)
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)
绿色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
就是这一切。现在你应该完成这样的细分:
<强> [注释] 强>