Triangle是由Jonathan Shewchuk开发的,用于实现平面二维Delaunay三角网格生成的开源代码库。Triangle官网
Triangle程序能够依照Delaunay准则生成高质量的三角网格、有约束条件的三角网格及Voronoi图等;所得网格可用于CFD或有限元分析
注:Delaunay准则即所生成网格中,任一三角形顶点都不能包含于网格内任何三角形的外接圆内。
程序代码采用C语言编写。并自带一个用于后处理/可视化的代码块(showme.c);在Linux系统下,可以使用showme所编译生成的可执行文件,来查看网格图。
代码的编译详见博客文章在Ubuntu18.04上编译SUNTANS模型
Triangle程序的输入是一个平面的、由多段直线构成的图形(又称Planar Straight Line Graph, PSLG)。
根据官网的说明,我拆解并分析了输入文件(*.poly)所包含的内容;输入文件的结构如下所示:
#第一部分
## 第一行: <结点总数> <图形维数(对于poly文件,该值必须为2)> <是否有结点属性值(0 or 1)> <是否有边界点标记(0 or 1)>
## 另起一行,按下列格式输入数据:<结点编号(一般以1,2,3...顺序依次输入)> <结点x坐标> <结点y坐标> [结点属性值] [结点边界标记]
#第二部分
## 第一行: <边的总数> <边是否有边界标记(0 or 1)>
**注意:上述的边(segment)指强制存在于网格区域或人工输入的边。
## 另起一行,按下列格式输入数据:<边的编号(一般以1,2,3...顺序依次输入)> <端点序号> <另一端点序号> [边的边界标记]
#第三部分
## 第一行: <网格剖分区域内空心区域的个数>
## 另起一行,按下列格式输入空心区域的形状(输入区域外轮廓坐标):<外轮廓上点的序号(一般以1,2,3...顺序依次输入)> <该点的x坐标> <该点的y坐标>
#第四部分(可选,非必要)
#可选的第四部分列出了区域属性值和最大三角形区域的区域约束的设定。只有当使用-A指令或者使用-A指令后没有数字,并且没有使用-r指令时,Triangle工具才会读取这部分内容。该设置点所包含的参数将适用于整个子区域或空心区域。
## 第一行: <需要设定属性值或最大三角形面积的区域块数>
## 另起一行,按下列格式输入数据:<设置点的编号(一般以1,2,3...顺序依次输入)> <该点的x坐标> <该点的y坐标> <设定的属性值> <该区域内最大三角形面积>
(网格设定的逻辑类似于DHI MIKE软件包中的MeshGenerator)
## Part 1: 4 vertices of a rectangle of 5m by 1m ##
4 2 0 0 # 4 points, 2-dimension
# makers x y (of the points)
1 0. 0.
2 5. 0.
3 5. 1.
4 0. 1.
## Part 2: 4 segments of rectangle with boundary markers ##
4 1 # 4 segments and these segments have marks
#Number. , makers of the start- and end- points, marks of segments
1 1 2 1 # south, mark=1
2 2 3 1 # east, mark=1
3 3 4 1 # north, mark=1
4 4 1 2 # west, another marker for this side, mark=2
## Part 3: holes (no holes in this case) ##
0
## Part 4: (no Part 4 in this case) ##
(注:#号后面的内容输入注释,每行#号后侧内容无法被程序读入)
在Triangle文件夹中新建一个名为 rectangle.poly的输入文件,并将上述内容输入到该文件中。
之后,在Triangle文件夹中打开终端,输入下列指令:
(注:以下操作均以Ubuntu系统下的操作为例)
./triangle -pq30a0.05I rectangle
上述指令的含义是:
# -p : 读入文件 * .poly
# -q30 : 指定三角形的最小角为30°
# -a0.05 : 指定三角形的最小面积 0.05 (平方米)
# -I : 网格迭代次数
输出的文件包含:
之后可以使用以下指令查看生成的网格:
./showme rectangle
.node文件的结构如下所示:
##第一行##
<节点总数> <图形维数(一般就是2)> <是否有结点属性值(0 or 1)> <是否有边界点标记(0 or 1)>
##余下各行##
<节点编号> <节点x坐标> <节点y坐标> [节点属性值(当第一行第三个参数为1时,才需输入此属性值)] [该节点的边界点标记(当第一行第四个参数为1时,才需输入此标记值]
以rectangle.node中的部分内容为例:
101 2 0 1
1 0 0 1
2 5 0 1
3 5 1 1
4 0 1 1
5 2 0 1
6 2.5 1 1
7 1.25 1 1
8 1 0 1
9 3.5 0 1
10 1.875 1 1
11 1.9780358181140232 0.4667395054897327 0
12 2.1875 0.53125 0
...(以下省略)
上面的第一行表示余下共有101个节点的信息,即除了第一行外,余下共有101行;并且各点带有边界点标记。此外,我们从中可知,第一个节点的坐标为(0,0),其边界点标记为1,第十二个点的坐标为(2.1875,0.53125),其边界点标记为0(其余各行的信息以此类推)。
.ele文件的结构如下所示:
##第一行##
<三角网格总数> <三角形各顶点的节点编号(由三个数字构成)> <网格中心是否有属性值(0 or 1)>
##余下各行##
<网格编号> <节点1> <节点2> <节点3> ... [网格中心属性值]
以rectangle.node中的部分内容为例:
159 3 0
1 47 43 41
2 19 21 15
3 82 84 79
4 75 28 70
5 70 84 8
6 13 29 11
7 98 6 21
8 75 70 74
9 15 14 24
10 31 30 5
...(以下省略)
上面的第一行表示余下共有159个三角形网格的信息,即除了第一行外,余下共有159行;并且各网格中心无属性值。此外,我们从中可知,第一个三角形网格由节点编号为47、43、41的三个节点构成,其中的节点编号参考对应的.node文件(其余各行的信息以此类推)。