tetgen_1_数据结构
tetgen是干嘛的?生成符合要求的四面体网格, 顺带也能生成其对偶图: 三维维诺
tetgen是怎么工作的?
tetgen有这三个大类
tetgenio
tetgenbehavior
tetgenmesh
其中
🍅 tetgenio
负责处理外部文件(比如.stl)与tetgen内置数据结构(tetgenmesh)的相互转换. 创建tetgenio对象的同时并不会直接创建数组, 需要分配内存.
这里面的数据结构大致是按照其内置文件 *.poly
文件划分的
点是用的一维向量, 比如[0][1][2]
[3][4][5]
是前面两个点
🍅 tetgenmesh
是 TetGen 内部使用的网格数据结构。它使用基于四面体的网格数据结构,并实现了基本的网格算法,包括创建 Delaunay 四面体网格、边界恢复、在网格域中放置斯坦纳点,以及优化网格的质量。同时也实现了局部修改网格的基本操作,例如简单的翻转操作等
🗡️ 四面体
typedef REAL** tetrahedron;
一个指向四个相邻四面体的指针;
一个指向四个顶点的指针;
一个指向四个子面(可选,用于 -p 开关)的指针;
一个指向六个线段(可选,用于 -p 开关)的指针;
一组用户自定义的浮点属性(可选);
一个体积约束(可选,用于 -a 开关);
一个整数类型的元素标记(和标志)。
🗡️ 子面
typedef REAL** shellface;
一个指向三个相邻子面(subface)的指针;
一个指向三个顶点的指针;
一个指向三个相邻线段(segment)的指针;
两个相邻四面体的指针;
一个面积约束(可选,用于 -q 开关);
一个整数类型的边界标记;
一个整数类型的标记,用于存储面的类型和标志信息。
🗡️ 点
typedef REAL* point;
x、y 和 z 坐标;
一组用户自定义的顶点属性(可选);
u 和 v 坐标(可选,用于 -s 开关);
一个度量张量(可选,用于 -q 或 -m 开关);
一个指向相邻四面体的指针;
一个指向父(或重复)点的指针;
一个指向相邻子面或线段的指针(可选,用于 -p 开关);
一个指向背景网格中的四面体(可选,用于 -m 开关);
一个整数类型的边界标记(顶点索引);
一个整数类型的点类型(和标志);
一个整数类型的几何标记(可选,用于 -s 开关)。
🗡️
triface
一个四面体中的12条有向边(每个面3条,4个面)
face
一个三角形中的6条有向边
🍅tetgenbehavior
就是说, 这个网格到底要怎么改造, 想生成CDT还是想要细化网格
源码使用了 Jonathan Shewchuk 写的 predicates
用来判断点相对于四面体的位置关系(即 orientation test)和点是否在球内的鲁棒几何谓词
🍅 接口
void tetrahedralize(tetgenbehavior* b, tetgenio* in, tetgenio* out,
tetgenio* addin = NULL, tetgenio* bgmin = NULL);
🍅 控制台入口
int main(int argc, char *argv[])