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[])
posted @ 2023-05-08 15:59  无形深空  阅读(183)  评论(0编辑  收藏  举报