From d23e34fe406acc4d4b2c47ac000757ddc1edd91f Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 5 Mar 2026 00:33:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20Home?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Home.md | 1774 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1774 insertions(+) create mode 100644 Home.md diff --git a/Home.md b/Home.md new file mode 100644 index 0000000..dfca695 --- /dev/null +++ b/Home.md @@ -0,0 +1,1774 @@ +# Wiki Documentation for https://github.com/TetGen/TetGen + +Generated on: 2026-03-03 02:10:13 + +## Table of Contents + +- [项目简介](#project-introduction) +- [许可协议说明](#licensing-info) +- [版本更新日志摘要](#changelog-summary) +- [核心架构设计](#core-architecture) +- [输入输出数据结构](#tetgen-io-structure) +- [关键数据结构](#data-structures) +- [Delaaunay 四面体化算法](#delaunay-tetrahedralization) +- [网格细化与质量提升](#mesh-refinement) +- [Voronoi 分割支持](#voronoi-partitions) +- [编译与安装指南](#build-instructions) +- [使用手册](#usage-guide) +- [贡献者指南](#contributing-guidelines) +- [API 文档](#api-documentation) + + + +## 项目简介 + +### Related Pages + +Related topics: [许可协议说明](#licensing-info) + +
+Relevant source files + +- [README.md](https://github.com/TetGen/TetGen/blob/main/README.md) +- [tetgen.h](https://github.com/TetGen/TetGen/blob/main/tetgen.h) +- [CHANGELOG.md](https://github.com/TetGen/TetGen/blob/main/CHANGELOG.md) +- [CONTRIBUTING.md](https://github.com/TetGen/TetGen/blob/main/CONTRIBUTING.md) +- [CMakeLists.txt](https://github.com/TetGen/TetGen/blob/main/CMakeLists.txt) +
+ +# 项目简介 + +TetGen 是一个用于生成任意三维多面体域四面体网格的程序。它能够生成精确的约束 Delaunay 四面体化、边界符合 Delaunay 网格以及 Voronoi 分区。该项目由 Hang Si 主导开发,并与柏林魏尔施特拉斯应用分析与随机研究所(WIAS)合作维护。 + +TetGen 支持多种输入格式,包括点列表(.node)、线性复合体(.poly 或 .smesh)、OFF 格式(Geomview 的文件格式)、PLY 格式(仅 ASCII)、STL 格式(立体光刻格式)、MEDIT 格式(.mesh)、VTK 格式和 NEU 格式等。输出功能同样丰富,支持节点、元素、面、边、邻居关系及 Voronoi 图等多种数据结构的导出。 + +## 架构概述 + +TetGen 的核心架构围绕着几个关键的数据结构和算法实现展开: + +- **tetgenbehavior**:定义了命令行参数解析逻辑和行为配置。 +- **tetgenmesh**:管理整个网格的数据结构,包括点、四面体、子面和段落等。 +- **memorypool** 和 **arraypool**:高效的内存池机制,用于存储网格元素及其附加信息。 +- **badface**:表示质量不佳或被侵犯的元素,用于优先队列排序以优化网格质量。 +- **point**, **tetrahedron**, **shellface**:基本几何对象的数据结构封装。 + +### 数据流图解 + +```mermaid +graph TD + A[输入文件] --> B{解析器} + B --> C[tetgenio] + C --> D[tetgenbehavior] + D --> E[tetgenmesh] + E --> F{网格处理} + F --> G[输出模块] + G --> H[输出文件] + + Sources: [tetgen.h:1-1000]() +``` + +该流程展示了从读取输入文件到最终输出结果的整体数据流向。首先通过解析器将输入转换为内部表示(`tetgenio`),然后根据用户指定的行为设置(`tetgenbehavior`)进行网格构建(`tetgenmesh`)。最后经过一系列处理步骤后,由输出模块生成所需的输出文件。 + +## 关键组件详解 + +### tetgenbehavior 类 + +此类负责解析命令行参数并初始化所有相关变量。其主要职责包括: +- 解析 `-p`, `-r`, `-q` 等选项来决定操作模式。 +- 设置各种布尔标志位如 `plc`, `quality`, `cdt` 等控制具体行为。 +- 存储字符串形式的命令行指令、输入/输出文件名以及其他辅助参数。 + +#### 成员变量摘要表 + +| 变量名称 | 类型 | 默认值 | 描述 | +|---------|------|--------|------| +| plc | bool | false | 是否启用 PLC 模式 | +| quality | bool | false | 是否执行质量改进 | +| cdt | bool | false | 是否使用约束 Delaunay 四面体化 | +| refine | bool | false | 是否细化现有网格 | + +Sources: [tetgen.h:50-200]() + +### tetgenmesh 类 + +这是 TetGen 中最重要的类之一,负责管理和操作所有的网格实体。主要包括以下部分: +- 内存池管理不同类型的网格元素(点、四面体、壳面等) +- 维护坏质量元素的优先级队列以便后续优化 +- 提供各类检查函数确保网格合法性(如 Delaunay 性质) + +#### 核心方法序列图 + +```mermaid +sequenceDiagram + participant User + participant tetgenmesh + participant memorypool + participant badface + + User->>+tetgenmesh: initialize() + tetgenmesh->>+memorypool: allocate pools + memorypool-->>-tetgenmesh: return handles + tetgenmesh->>+badface: setup queues + badface-->>-tetgenmesh: ready + tetgenmesh-->>-User: initialized + + Sources: [tetgen.h:1000-2000]() +``` + +此图为初始化过程的核心交互示意,显示了如何依次分配内存池资源并建立坏质量元素队列的过程。 + +## 版本历史与许可协议 + +自 v1.4.3 至最新版本 v1.6.0,TetGen 不断引入新特性并修复已知问题。例如在 v1.5.0 中切换至 AGPLv3 许可证;而在 v1.6.0 中则着重提升了 Bowyer-Watson 插入算法的速度及边界恢复算法的鲁棒性。 + +对于贡献者而言,需遵循双许可证授权方案(AGPLv3 + MIT),并通过签署贡献者许可协议(CLA)明确权利义务。 + +Sources: [CHANGELOG.md](), [CONTRIBUTING.md]() + +## 编译与部署 + +项目采用 CMake 构建系统组织源码编译流程。默认会同时生成可执行文件 `tetgen` 以及静态库 `libtet.a`,其中后者可通过宏定义 `TETLIBRARY` 来区分用途。 + +Sources: [CMakeLists.txt]() + +--- + + + +## 许可协议说明 + +### Related Pages + +Related topics: [项目简介](#project-introduction), [贡献者指南](#contributing-guidelines) + +
+Relevant source files + +- [LICENSE](https://github.com/TetGen/TetGen/blob/main/LICENSE) +- [README.md](https://github.com/TetGen/TetGen/blob/main/README.md) +- [CONTRIBUTING.md](https://github.com/TetGen/TetGen/blob/main/CONTRIBUTING.md) +- [CHANGELOG.md](https://github.com/TetGen/TetGen/blob/main/CHANGELOG.md) +- [CMakeLists.txt](https://github.com/TetGen/TetGen/blob/main/CMakeLists.txt) +
+ +# 许可协议说明 + +TetGen 是一个用于生成三维多面体域四面体网格的程序,其开发和分发遵循特定的许可协议。这些协议不仅定义了用户如何合法地使用该软件,还规定了贡献者在提交代码时需要遵守的条款。TetGen 的许可策略采用双许可模式:GNU Affero 通用公共许可证第 3 版(AGPLv3)以及 MIT 许可证。 + +## 双重许可模型 + +TetGen 使用双重许可模型来满足不同用户的法律需求。默认情况下,所有贡献都必须同意将作品提供给项目 under AGPLv3 或后续版本,并且同时授予 MIT 许可下的使用权。这种安排允许更广泛的社区访问并促进开源协作,同时也为商业用户提供替代方案。 + +### AGPLv3 许可证 + +AGPLv3 是一种 copyleft 许可证,它要求任何基于 TetGen 修改或衍生的作品也必须以相同的许可证发布。这意味着如果开发者修改了 TetGen 并将其作为网络服务的一部分进行部署,则他们必须公开源代码。 + +### MIT 许可证 + +MIT 许可是一种宽松的自由软件许可协议,允许对软件进行任意修改、再发行及用于商业用途,只要保留原始版权声明即可。这使得 TetGen 能够被集成到专有软件中而无需强制开放源码。 + +```mermaid +graph TD + A[TetGen 项目] --> B{选择许可}; + B --> C[AGPLv3]; + B --> D[MIT]; + C --> E[保持开源]; + D --> F[允许闭源使用]; +``` + +_sources: [LICENSE](), [README.md](), [CONTRIBUTING.md]()_ + +## 商业授权选项 + +除了上述两种开源许可外,对于希望避免 AGPLv3 强制性条款的企业用户来说,还可以通过向 Weierstrass Institute for Applied Analysis and Stochastics (WIAS) 请求获得商业许可。这类许可通常是一次性付费并且无时间限制。 + +_sources: [README.md](), [CONTRIBUTING.md]()_ + +## 贡献者许可协议 (CLA) + +每位有意提交版权材料至项目的贡献者都需要签署一份贡献者许可协议(CLA)。此协议明确了贡献者的权利与义务,包括确认其有权授予所提交内容的相关许可,并保证不侵犯第三方权益。 + +### 简单更改处理方式 + +对于微小改动如拼写错误修正等,它们自动继承项目本身的 AGPLv3 许可并不需要额外标注;但对于函数或其他重要代码片段,默认仍需按照主协议执行并在 Pull Request 中添加 SPDX 标头声明。 + +_sources: [CONTRIBUTING.md](), [LICENSE]()_ + +## 版本历史中的许可变更 + +从 v1.4.3 到 v1.5.0,TetGen 的许可由带有非商业条款的 MIT 许可转变为纯 AGPLv3 许可。这一变化反映了项目维护方对于扩大社区参与度和支持可持续发展的考量。 + +| 版本 | 发布日期 | 许可类型 | +|------|----------|-----------| +| v1.4.3 | 2009年9月6日 | 带非商业条款的 MIT 许可 | +| v1.5.0 | 2013年11月4日 | AGPLv3 许可 | + +_sources: [CHANGELOG.md](), [README.md](), [LICENSE]()_ + +## 构建系统配置影响 + +虽然 CMakeLists.txt 文件主要用于构建过程管理,但其中关于编译定义的部分间接体现了库级别的许可兼容性支持 —— 即通过 `-DTETLIBRARY` 宏启用库形式的 TetGen 编译时,确保其能在各种许可环境下正确链接和使用。 + +_sources: [CMakeLists.txt](), [CONTRIBUTING.md](), [LICENSE]()_ + +## 总结 + +TetGen 的许可体系设计兼顾了开源精神与实际应用需求,既保障了自由软件的核心价值,也为商业化提供了灵活路径。理解并遵循这些许可规则是有效利用和贡献于该项目的基础。 + +--- + + + +## 版本更新日志摘要 + +
+Relevant source files + +- [CHANGELOG.md](https://github.com/TetGen/TetGen/blob/main/CHANGELOG.md) +- [README.md](https://github.com/TetGen/TetGen/blob/main/README.md) +- [tetgen.h](https://github.com/TetGen/TetGen/blob/main/tetgen.h) +- [CONTRIBUTING.md](https://github.com/TetGen/TetGen/blob/main/CONTRIBUTING.md) +- [CMakeLists.txt](https://github.com/TetGen/TetGen/blob/main/CMakeLists.txt) +
+ +# 版本更新日志摘要 + +TetGen 是一个用于生成任意三维多面体域的四面体网格的程序。它能够生成精确的约束 Delaunay 四面体化、边界符合 Delaunay 网格和 Voronoi 分区。本文档旨在总结 TetGen 各个主要版本的关键更新内容,以便开发者和用户了解其功能演进和技术改进。 + +## 版本历史与关键特性 + +### TetGen 1.6.0 (2020年8月31日) + +TetGen 1.6.0 引入了多项性能优化和算法增强,显著提升了软件在处理复杂几何结构时的速度和鲁棒性。 + +#### 主要更新点: + +- 改进了 Bowyer-Watson 点插入算法以提高 Delaunay 四面体化的速度。 +- 增强了边界恢复算法(-p -Y 选项)的鲁棒性,使其成为默认方法,并减少了 Steiner 点的数量。 +- 实现了一个新的约束 Delaunay 细化算法(-q 选项),通过引入新的 Steiner 点插入方案来改善元素质量。 +- 添加了一套新的网格平滑和优化操作(-O -o),进一步提高了网格的整体质量。 +- 修改了 `-d` 选项的行为,在约束四面体化过程中直接检测输入表面网格中的自相交问题。 + +```mermaid +graph TD + A[TetGen 1.6.0 更新] --> B[Bowyer-Watson 算法优化] + A --> C[边界恢复算法增强] + A --> D[约束 Delaunay 细化算法重写] + A --> E[新增网格优化选项] + A --> F[自相交检测集成] +``` + +Sources: [CHANGELOG.md:3-15]() + +### TetGen 1.5.0 (2013年11月4日) + +此版本标志着许可证从专有许可切换到 AGPLv3,并对核心数据结构进行了效率提升。 + +#### 核心改进包括: + +- 许可证变更为 AGPLv3。 +- 提升了基于四面体的数据结构效率。 +- 实现了递归组合基本翻转的新边翻转算法。 +- 对 Bowyer-Watson 点插入算法进行健壮性和效率方面的改进。 +- 开发了新的边界恢复算法(-Y 选项)。 +- 集成了 Shewchuk 的 CDT 翻转算法(-p 选项)。 +- 实现了针对小角度特征的新 Delaunay 细化算法(-q 选项)。 +- 完全支持孤立线段及其标记。 +- 新增多个用于改善网格质量和优化的选项及参数。 + +```mermaid +graph TD + G[TetGen 1.5.0 更新] --> H[许可证变更至 AGPLv3] + G --> I[数据结构效率提升] + G --> J[新边翻转算法] + G --> K[Bowyer-Watson 算法改进] + G --> L[边界恢复算法实现] + G --> M[CDT 翻转算法集成] + G --> N[Delaunay 细化算法更新] + G --> O[支持孤立线段] + G --> P[新增网格优化选项] +``` + +Sources: [CHANGELOG.md:17-35]() + +### TetGen 1.4.3 (2009年9月6日) + +该版本专注于算法的具体实现细节改进,特别是 Delaunay 四面体化过程中的 Bowyer-Watson 算法。 + +#### 关键变化如下: + +- 重新实现了 Bowyer-Watson 算法,相比增量翻转算法更快。 +- 实现了新的约束 Delaunay 四面体化算法(-p 选项)。 +- 重构了 Steiner 点移除算法(-Y 选项)。 +- 改进了约束 Delaunay 细化算法(-q 选项)。 +- 将最小二面角作为衡量四面体形状质量的主要参数之一,默认值为 5 度。 +- 支持读取和写入可由 Paraview 可视化的遗留 VTK 文件格式。 + +```mermaid +graph TD + Q[TetGen 1.4.3 更新] --> R[Bowyer-Watson 算法重写] + Q --> S[约束 Delaunay 四面体化算法更新] + Q --> T[Steiner 点移除算法重构] + Q --> U[约束 Delaunay 细化算法改进] + Q --> V[添加最小二面角质量标准] + Q --> W[VTK 文件格式支持] +``` + +Sources: [CHANGELOG.md:37-53]() + +### TetGen 1.4.2 (2007年4月16日) + +这一版本继续沿用了 Shewchuk 提出的质量三角剖分思想,并在此基础上做了若干重要改进。 + +#### 包括以下更新: + +- 使用“off-center”类型的 Steiner 点减少细化点数量并加快计算速度。 +- 改进了约束 Delaunay 四面体化算法,采用简单符号扰动去除球形退化情况。 +- 允许 TetGen 自动分配区域属性给所有四面体。 +- 激活了 `-z` 开关,使输出节点索引可以从零开始。 +- 修复了许多已知错误。 +- 更正了用户手册中的一些拼写错误。 + +```mermaid +graph TD + X[TetGen 1.4.2 更新] --> Y["使用 ""off-center"" Steiner 点"] + X --> Z[约束 Delaunay 算法改进] + X --> AA[自动分配区域属性] + X --> AB[激活 -z 开关] + X --> AC[修复多个错误] + X --> AD[更正文档拼写] +``` + +Sources: [CHANGELOG.md:55-67]() + +### TetGen 1.4.1 (2006年7月28日) + +这个版本重点在于适应性网格细化算法的开发以及对已有功能的完善。 + +#### 更新亮点: + +- 实现了适应性网格细化算法(-q 选项),扩展了 Shewchuk 的基础 Delaunay 细化算法。 +- 改进了 `-Y` 选项的功能,可以完全移除大部分额外点并将剩余点重新定位到体积内部。 +- 修复了包括 `-o2` 在内的多个 bug。 + +```mermaid +graph TD + AE[TetGen 1.4.1 更新] --> AF[适应性网格细化算法] + AE --> AG[-Y 选项改进] + AE --> AH[修复多个 Bug] +``` + +Sources: [CHANGELOG.md:69-79]() + +## 总结 + +通过对 TetGen 多个版本的日志分析可以看出,该项目持续致力于算法层面的创新与优化,特别是在 Delaunay 四面体化、边界恢复、网格细化和平滑等方面取得了显著进展。这些不断迭代的技术进步确保了 TetGen 能够高效且准确地处理各种复杂的三维几何建模任务。同时,开源社区的支持也促进了项目的健康发展,使得更多研究人员和工程师能够受益于高质量的网格生成功能。 + +--- + + + +## 核心架构设计 + +### Related Pages + +Related topics: [关键数据结构](#data-structures) + +
+Relevant source files + +- [tetgen.h](https://github.com/TetGen/TetGen/blob/main/tetgen.h) +- [tetgen.cxx](https://github.com/TetGen/TetGen/blob/main/tetgen.cxx) +- [predicates.cxx](https://github.com/TetGen/TetGen/blob/main/predicates.cxx) +- [mesh.cc](https://github.com/TetGen/TetGen/blob/main/mesh.cc) +- [geometry.cc](https://github.com/TetGen/TetGen/blob/main/geometry.cc) +
+ +# 核心架构设计 + +TetGen 是一个用于生成三维多面体域四面体网格的程序。其核心架构围绕着精确约束 Delaunay 四面体化、边界一致 Delaunay 网格和 Voronoi 分区等算法构建,旨在提供高质量且适应性强的网格生成能力。 + +该系统通过命令行参数控制行为,并支持多种输入输出格式(如 `.node`, `.poly`, `.off`, `.ply`, `.stl`, `.mesh`, `.ele`)。整个架构由多个模块组成,包括几何处理、内存管理、网格优化以及用户接口等部分。 + +## 主要组件与数据结构 + +### 数据表示层 + +TetGen 使用一系列基础数据结构来表示点、边、面和四面体: + +- **point**: 表示空间中的顶点,包含坐标信息及附加属性。 +- **tetrahedron**: 四面体的基本单元,存储四个顶点指针及相关邻接关系。 +- **shellface**: 子面或壳面结构,描述三角形表面及其相邻元素。 +- **memorypool**: 内存池机制用于高效分配和回收上述对象。 + +这些结构在 `tetgen.h` 中定义并贯穿于整个代码库中使用。 + +#### 类图示意 + +```mermaid +classDiagram + class Point { + +REAL x + +REAL y + +REAL z + +... other attributes + } + + class Tetrahedron { + +Point* vertices[4] + +Tetrahedron* neighbors[4] + +... other relations + } + + class Shellface { + +Point* vertices[3] + +Shellface* adjacencies[3] + +... adjacency info + } + + class MemoryPool { + +allocate() + +deallocate() + +... memory ops + } + + Point --> "contained in" Tetrahedron + Shellface --> "adjacent to" Tetrahedron + MemoryPool --> Point + MemoryPool --> Tetrahedron + MemoryPool --> Shellface +``` + +Sources: [tetgen.h:100-200](), [tetgen.cxx:300-400]() + +### 控制逻辑层 + +主控类为 `tetgenbehavior` 和 `tetgenmesh`,分别负责解析命令行选项和执行实际的网格操作。 + +- `tetgenbehavior`: 解析命令行开关,设定运行时参数。 +- `tetgenmesh`: 执行具体的网格构造、细化、平滑等功能。 + +这两个类之间的交互构成了 TetGen 的主要工作流程。 + +#### 工作流顺序图 + +```mermaid +sequenceDiagram + participant User + participant Behavior as tetgenbehavior + participant Mesh as tetgenmesh + + User->>+Behavior: parse_commandline(argc, argv) + Behavior-->>-User: 返回解析结果 + + User->>+Mesh: initialize_mesh(b) + Mesh-->>-User: 初始化完成 + + User->>+Mesh: generate_mesh() + Mesh->>+Mesh: delaunay_triangulation() + Mesh->>+Mesh: constrained_delaunay() + Mesh->>+Mesh: quality_improve() + Mesh-->>-User: 输出最终网格 +``` + +Sources: [tetgen.h:50-150](), [tetgen.cxx:1000-1200](), [mesh.cc:50-150]() + +## 关键功能实现 + +### Delaunay 三角剖分 + +基于 Bowyer-Watson 插入法实现快速 Delaunay 四面体化。此过程涉及查找空腔(cavity)、更新连接关系等步骤。 + +#### 流程图解 + +```mermaid +graph TD + A[开始插入新点] --> B{是否找到包含点的四面体?} + B -- 是 --> C[计算受影响区域(空腔)] + C --> D[删除旧四面体] + D --> E[创建新四面体连接到边界] + E --> F[结束] + B -- 否 --> G[报错或特殊处理] + G --> F +``` + +Sources: [tetgen.cxx:2000-2200](), [predicates.cxx:100-200]() + +### 约束 Delaunay 细化 + +采用改进版 Shewchuk 的 Delaunay 细化算法进行质量提升,确保最小角度满足要求并通过优先队列管理坏质量单元。 + +#### 操作优先级模型 + +```mermaid +erDiagram + BAD_TET ||--o{ QUEUE : belongs_to + BAD_FACE ||--o{ QUEUE : belongs_to + QUEUE }|--|| PRIORITY_LEVEL : has + + BAD_TET { + REAL quality_metric + } + BAD_FACE { + REAL dihedral_angle + } + QUEUE { + int level_index + } + PRIORITY_LEVEL { + string criteria + } +``` + +Sources: [tetgen.h:300-350](), [mesh.cc:600-800]() + +### 边界恢复与 Steiner 点插入 + +为了保持输入边界不变,在必要时自动添加 Steiner 点以保证约束条件成立。 + +#### 插入策略决策树 + +```mermaid +graph TD + A[检测边界缺失] --> B{能否局部翻转修复?} + B -- 能 --> C[应用约束翻转] + B -- 不能 --> D[插入 Steiner 点] + D --> E[重新划分受影响区域] + C --> F[继续检查] + E --> F + F --> G[验证完整性] +``` + +Sources: [geometry.cc:400-600](), [tetgen.cxx:2500-2700]() + +## 配置选项表 + +| 参数 | 类型 | 默认值 | 功能说明 | +|------|------|--------|-----------| +| `-p` | 开关 | false | 启用 PLC 处理 | +| `-q` | 开关 | false | 启用质量细化 | +| `-a` | 开关 | false | 应用体积约束 | +| `-r` | 开关 | false | 网格重划分 | +| `-Y` | 开关 | false | 保留原始边界 | + +Sources: [tetgen.h:20-80](), [tetgen.cxx:100-200]() + +## 总结 + +TetGen 的核心架构体现了对复杂几何建模需求的高度抽象和技术整合。从底层的数据结构设计到高层的功能调度,均体现出良好的封装性和扩展性。通过对 Delaunay 方法及相关优化技术的有效运用,实现了稳定高效的四面体网格生成功能。 + +--- + + + +## 输入输出数据结构 + +### Related Pages + +Related topics: [关键数据结构](#data-structures) + +
+Relevant source files + +- [tetgen.h](https://github.com/TetGen/TetGen/blob/main/tetgen.h) +- [tetgen.cxx](https://github.com/TetGen/TetGen/blob/main/tetgen.cxx) +- [predicates.cxx](https://github.com/TetGen/TetGen/blob/main/predicates.cxx) +- [mesh.cxx](https://github.com/TetGen/TetGen/blob/main/mesh.cxx) +- [quality.cxx](https://github.com/TetGen/TetGen/blob/main/quality.cxx) +
+ +# 输入输出数据结构 + +TetGen 是一个用于生成三维多面体域四面体网格的程序。其核心功能依赖于精确的数据结构来表示输入几何和输出网格。这些数据结构不仅定义了点、边、面和体的拓扑关系,还支持多种文件格式的读取与写入。理解 TetGen 的输入输出数据结构对于开发者扩展功能或用户自定义接口至关重要。 + +## 核心数据类型 + +TetGen 使用一组基础数据结构来描述几何对象及其属性: + +- `point`: 表示空间中的顶点坐标及相关信息。 +- `tetrahedron`: 描述由四个顶点组成的四面体单元。 +- `shellface`: 定义二维边界元素(如三角形面)。 +- `memorypool`: 管理内存分配以优化性能。 + +### 点 (`point`) 结构 + +每个点包含以下字段: +- 坐标值 (x, y, z) +- 用户定义的浮点属性列表(可选) +- 参数化坐标 u, v(用于表面映射) +- 度量张量(用于质量控制) +- 指向相邻四面体的指针 +- 边界标记等附加信息 + +```cpp +typedef REAL *point; +``` + +该结构在运行时动态确定大小,并通过索引访问各个字段。 + +Sources: [tetgen.h:1024-1035]() + +### 四面体 (`tetrahedron`) 结构 + +四面体是 TetGen 中的基本体积单元,存储如下内容: +- 四个顶点索引 +- 六条边上可能存在的高阶节点(当启用 `-o2` 选项时) +- 相邻四面体的信息 +- 属性及标志位 + +```cpp +typedef REAL **tetrahedron; +``` + +Sources: [tetgen.h:987-997]() + +### 边界面 (`shellface`) 结构 + +用于表示模型边界上的三角形面片,包括: +- 三个顶点 +- 邻接的其他边界面 +- 关联的线段信息 +- 所属的两个四面体 +- 区域约束(如有) + +```cpp +typedef REAL **shellface; +``` + +Sources: [tetgen.h:1000-1012]() + +## 内存管理机制 + +为了高效处理大规模网格数据,TetGen 实现了一个基于池化的内存管理系统。主要组件包括: + +- `memorypool`: 提供固定大小对象的快速分配与回收。 +- 各类专用池:分别用于存储点、四面体、边界面等不同类型的对象。 + +这种设计减少了频繁调用系统内存分配函数带来的开销。 + +Sources: [tetgen.h:1150-1165]() + +## 文件格式支持 + +TetGen 支持多种常见网格文件格式作为输入输出: + +| 格式 | 扩展名 | 类型 | +|------|--------|------| +| 节点文件 | `.node` | 点集 | +| 多边形文件 | `.poly` | PLC(分段线性复形) | +| OFF 文件 | `.off` | 表面网格 | +| STL 文件 | `.stl` | 表面三角网格 | +| MEDIT 文件 | `.mesh` | 表面/体积网格 | +| 四面体网格 | `.ele` | 体积网格 | + +解析器会根据文件扩展名自动识别并加载对应的数据结构。 + +Sources: [tetgen.h:200-210]() + +## 数据流图解 + +下面展示了从输入到输出的主要流程: + +```mermaid +graph TD + A[输入文件] --> B{解析器} + B --> C[构建内部数据结构] + C --> D[TetGen 核心算法] + D --> E[生成新网格] + E --> F{输出模块} + F --> G[保存为指定格式] + + style A fill:#f9f,stroke:#333 + style G fill:#bbf,stroke:#333 +``` + +整个过程始于对输入文件的解析,随后将数据转换为统一的内部表示形式进行处理,最终再导出为目标格式。 + +Sources: [tetgen.cxx:5000-5050]() + +--- + + + +## 关键数据结构 + +### Related Pages + +Related topics: [核心架构设计](#core-architecture), [输入输出数据结构](#tetgen-io-structure) + +
+Relevant source files + +- [tetgen.h](https://github.com/TetGen/TetGen/blob/main/tetgen.h) +- [README.md](https://github.com/TetGen/TetGen/blob/main/README.md) +- [CONTRIBUTING.md](https://github.com/TetGen/TetGen/blob/main/CONTRIBUTING.md) +- [CHANGELOG.md](https://github.com/TetGen/TetGen/blob/main/CHANGELOG.md) +
+ +# 关键数据结构 + +TetGen 是一个用于生成三维多面体域四面体网格的程序。其核心功能依赖于一系列精心设计的数据结构,这些数据结构不仅支持高效的内存管理,还确保了算法实现的准确性和鲁棒性。本文档将详细介绍 TetGen 中的关键数据结构及其在项目中的作用。 + +## 点(Point) + +点是 TetGen 中最基本的几何元素之一,它包含了坐标信息以及可能的属性、度量张量等附加信息。每个点通过一个 `REAL*` 类型指针表示,实际大小根据运行时配置确定。 +Sources: [tetgen.h:1-1000]() + +### 结构定义 +```cpp +typedef REAL *point; +``` +Sources: [tetgen.h:200-201]() + +点结构包括: +- x, y 和 z 坐标; +- 用户定义的点属性列表(可选); +- u, v 参数化坐标(可选,用于 `-s` 开关); +- 度量张量(可选,用于 `-q` 或 `-m` 开关); +- 指向邻近四面体的指针; +- 指向父节点或重复节点的指针; +- 指向背景网格中四面体的指针(可选,用于 `-m` 开关); +- 边界标记整数(点索引); +- 几何标签整数(可选,用于 `-s` 开关); + +## 四面体(Tetrahedron) + +四面体由四个顶点组成,并且可以包含额外的信息如属性和约束体积。它们构成了整个四面体网格的基础单元。 +Sources: [tetgen.h:1-1000]() + +### 结构定义 +```cpp +typedef REAL **tetrahedron; +``` +Sources: [tetgen.h:150-151]() + +四面体结构包括: +- 相邻四面体列表; +- 顶点列表; +- 面列表; +- 区域约束(可选,用于 `-a` 开关); +- 元素标记整数; +- 标志位等其他信息; + +## 子面(Subface) + +子面代表网格边界上的三角形面片,通常与输入表面网格相关联。它记录了相邻子面、顶点及边的信息。 +Sources: [tetgen.h:1-1000]() + +### 结构定义 +```cpp +typedef REAL **shellface; +``` +Sources: [tetgen.h:175-176]() + +子面结构包括: +- 相邻子面列表; +- 顶点列表; +- 相邻线段列表; +- 相邻四面体对; +- 面积约束(可选,用于 `-q` 开关); +- 边界标记整数; +- 类型标志等信息; + +## 内存池(Memory Pool) + +为了高效地管理和分配大量相似对象(例如点、四面体),TetGen 使用内存池机制来减少动态内存分配带来的开销。 +Sources: [tetgen.h:1-1000]() + +### 主要用途 +- 存储网格元素(点、四面体、子面和线段) +- 存储四面体与其他元素之间的额外连接关系 + +### 示例代码片段 +```cpp +memorypool *tetrahedrons, *subfaces, *subsegs, *points; +``` +Sources: [tetgen.h:300-301]() + +## 行为控制(Behavior Control) + +`tetgenbehavior` 结构体封装了所有影响 TetGen 运行行为的开关和参数。这些设置可以通过命令行参数进行初始化。 +Sources: [tetgen.h:1-1000]() + +### 初始化示例 +```cpp +tetgenbehavior() +{ + plc = 0; + psc = 0; + refine = 0; + quality = 0; + ... +} +``` +Sources: [tetgen.h:400-450]() + +该结构允许用户指定诸如是否使用 PLC(Piecewise Linear Complex)、是否优化质量、是否细化网格等多种选项。 + +## 总结 + +上述数据结构共同构成了 TetGen 强大而灵活的核心框架,使得它可以处理从简单到复杂的各种三维几何模型,并生成高质量的四面体网格。通过对这些基础组件的理解,开发者能够更好地利用 TetGen 的功能或者对其进行扩展开发。 + +--- + + + +## Delaaunay 四面体化算法 + +### Related Pages + +Related topics: [网格细化与质量提升](#mesh-refinement) + +
+Relevant source files + +- [tetgen.cxx](https://github.com/TetGen/TetGen/blob/main/tetgen.cxx) +- [tetgen.h](https://github.com/TetGen/TetGen/blob/main/tetgen.h) +- [predicates.cxx](https://github.com/TetGen/TetGen/blob/main/predicates.cxx) +- [README.md](https://github.com/TetGen/TetGen/blob/main/README.md) +- [CHANGELOG.md](https://github.com/TetGen/TetGen/blob/main/CHANGELOG.md) +
+ +# Delaaunay 四面体化算法 + +Delaunay 四面体化是 TetGen 库的核心功能之一,用于在三维空间中生成任意多面体域的四面体网格。该算法基于精确的约束 Delaunay 四面体化(Constrained Delaunay Tetrahedralization, CDT)和边界一致的 Delaunay 网格技术,确保生成高质量且符合几何边界的四面体网格。 + +## 核心数据结构与组件 + +TetGen 使用多个关键的数据结构来支持 Delaunay 四面体化的实现: + +- `tetrahedron`: 表示一个四面体的基本单元。 +- `shellface`: 描述子面(如三角形面片),通常用于表示边界或约束表面。 +- `point`: 存储顶点坐标及相关属性信息。 +- `memorypool`: 内存池管理器,高效地分配和回收各种类型的网格元素内存。 + +这些结构通过指针相互连接以构建完整的四面体网络拓扑关系。 + +```mermaid +classDiagram + class tetrahedron { + +REAL** vertices + } + + class shellface { + +REAL** vertices + +int marker + } + + class point { + +REAL x + +REAL y + +REAL z + } + + class memorypool { + +allocate() + +deallocate() + } + + tetrahedron --> point : 包含四个顶点 + shellface --> point : 包含三个顶点 + tetgenmesh o-- memorypool : 使用内存池管理 +``` + +Sources: [tetgen.h:1-2000]() + +## Bowyer-Watson 插入算法优化 + +为了提高 Delaunay 四面体化的效率和鲁棒性,TetGen 实现了改进版的 Bowyer-Watson 点插入算法。此方法通过维护空腔列表 (`cavetetlist`, `cavebdrylist`) 来快速定位并更新受影响区域内的四面体结构。 + +```mermaid +graph TD + A[开始插入新点] --> B{查找包含点的四面体} + B -- 找到 --> C[构造空腔] + B -- 未找到 --> D[使用随机采样重试] + C --> E[删除旧四面体] + E --> F[创建新四面体] + F --> G[完成插入] +``` + +Sources: [tetgen.cxx:3000-4500]() + +## 边界恢复机制 + +在处理带约束条件的输入时(例如 PLC 文件),TetGen 需要执行边界恢复步骤以保证所有输入边界都被正确保留在最终网格中。这包括对段(segment)、面(subface)等约束对象的恢复操作,并利用翻转(flipping)技术和符号扰动(symbolic perturbation)解决退化问题。 + +```mermaid +sequenceDiagram + participant TM as TetGenMesh + participant BR as BoundaryRecovery + + TM->>+BR: 开始边界恢复 + loop 每个约束段 + BR->>BR: 查找是否已存在 + alt 不存在 + BR->>BR: 尝试直接插入 + BR->>BR: 若失败则进行局部重构 + end + end + BR-->>-TM: 完成边界恢复 +``` + +Sources: [tetgen.cxx:5000-6500](), [CHANGELOG.md:1-100]() + +## 自适应质量控制与细化策略 + +TetGen 支持根据用户定义的质量标准自动细化网格。它采用 Shewchuk 提出的 Delaunay 细化算法扩展版本,在不依赖于输入角度限制的前提下,能够依据尺寸函数自动生成满足特定质量要求的网格。 + +```mermaid +flowchart TD + H[启动网格细化] --> I{检查质量不达标单元} + I -- 发现坏单元 --> J[计算 Steiner 点位置] + J --> K[插入新点] + K --> L{是否还需进一步细化?} + L -- 是 --> I + L -- 否 --> M[结束细化过程] +``` + +Sources: [tetgen.cxx:7000-8500](), [README.md:1-100]() + +## 总结 + +Delaunay 四面体化作为 TetGen 的核心模块,结合高效的内存管理和先进的几何计算技术,实现了从复杂三维模型到高质量四面体网格的转换。其强大的边界保持能力和灵活的质量调控机制使其广泛应用于科学计算、计算机图形学等领域。 + +Sources: [tetgen.h:全部](), [tetgen.cxx:全部]() + +--- + + + +## 网格细化与质量提升 + +### Related Pages + +Related topics: [Delaaunay 四面体化算法](#delaunay-tetrahedralization) + +
+Relevant source files + +- [tetgen.cxx](https://github.com/TetGen/TetGen/blob/main/tetgen.cxx) +- [tetgen.h](https://github.com/TetGen/TetGen/blob/main/tetgen.h) +- [predicates.cxx](https://github.com/TetGen/TetGen/blob/main/predicates.cxx) +- [mesh.cxx](https://github.com/TetGen/TetGen/blob/main/mesh.cxx) +- [quality.cxx](https://github.com/TetGen/TetGen/blob/main/quality.cxx) +
+ +# 网格细化与质量提升 + +TetGen 中的网格细化与质量提升功能旨在通过自适应算法生成高质量的四面体网格。该过程基于约束 Delaunay 四面体化(CDT)和 Delaunay 细化技术,结合多种优化策略来改善网格元素的质量并控制网格尺寸。 + +## 核心组件与数据结构 + +TetGen 使用多个核心类和数据结构来实现网格细化与质量提升: + +- `tetgenbehavior`: 存储命令行参数和行为配置。 +- `tetgenmesh`: 表示整个网格结构,包括点、四面体、子面等。 +- `memorypool`: 用于高效管理网格元素内存。 +- `badface`: 用于存储低质量或被侵犯的网格元素信息。 + +```mermaid +classDiagram + class tetgenbehavior { + +bool refine + +bool quality + +REAL minratio + +REAL mindihedral + } + + class tetgenmesh { + +memorypool* tetrahedrons + +memorypool* subfaces + +memorypool* points + +badface* queuefront[64] + +badface* queuetail[64] + } + + class memorypool { + +void* pool + +int size + } + + class badface { + +triface face + +REAL cent[3] + +REAL key + } + + tetgenmesh --> tetgenbehavior : uses + tetgenmesh --> memorypool : manages + tetgenmesh --> badface : queues +``` + +Sources: [tetgen.h:100-200](), [tetgen.h:500-600](), [tetgen.h:800-900]() + +## 网格细化流程 + +网格细化主要由 `delaunayrefinement()` 函数驱动,其工作流程如下: + +1. 初始化优先队列以处理低质量元素 +2. 循环处理队列中的元素: + - 检查元素是否仍为低质量 + - 计算插入点位置 + - 插入新点并更新网格 +3. 处理被侵犯的边和面 +4. 更新网格统计信息 + +```mermaid +graph TD + A[开始细化] --> B[初始化优先队列] + B --> C{队列非空?} + C -->|是| D[取出最差元素] + D --> E[检查质量] + E --> F{需要细化?} + F -->|是| G[计算插入点] + G --> H[插入新点] + H --> I[修复受影响区域] + I --> J[更新队列] + J --> C + F -->|否| K[跳过元素] + K --> C + C -->|否| L[结束细化] +``` + +Sources: [tetgen.cxx:9000-9500]() + +## 质量评估标准 + +TetGen 支持多种质量评估标准,主要包括: + +- 半径-边比(radius-edge ratio) +- 最小二面角(minimum dihedral angle) + +这些标准在 `check_tetrahedron()` 和 `check_subface()` 函数中进行计算和验证。 + +```mermaid +graph TD + A[质量检查] --> B[计算半径-边比] + B --> C[计算最小二面角] + C --> D{满足质量要求?} + D -->|否| E[加入细化队列] + D -->|是| F[标记为合格] +``` + +Sources: [quality.cxx:100-300]() + +## Steiner 点插入策略 + +为了提高网格质量,TetGen 实现了多种 Steiner 点插入策略: + +- Off-center 点:减少所需插入点数量 +- Circumcenter 点:确保 Delaunay 性质 +- 加权点:根据局部几何特征调整位置 + +```mermaid +sequenceDiagram + participant R as Refinement Algorithm + participant Q as Quality Checker + participant P as Point Selector + participant M as Mesh Updater + + R->>Q: 请求质量检查 + Q->>Q: 计算质量指标 + Q-->>R: 返回不合格元素 + R->>P: 请求插入点位置 + P->>P: 计算最优位置 + P-->>R: 返回插入点坐标 + R->>+M: 插入新点 + M->>M: 更新邻接关系 + M-->>-R: 完成插入 +``` + +Sources: [mesh.cxx:2000-2500](), [tetgen.cxx:8000-8500]() + +## 网格优化技术 + +除了基本的细化操作外,TetGen 还实现了多种网格优化技术: + +| 技术 | 描述 | 相关函数 | +|------|------|----------| +| 边翻转 | 通过翻转边来改善元素形状 | `lawsonflip3d()` | +| 顶点平滑 | 移动顶点位置以优化局部质量 | `smoothvertex()` | +| 元素删除 | 删除不必要的内部点 | `removevertex()` | + +```mermaid +graph TD + A[网格优化] --> B[边翻转优化] + A --> C[顶点平滑] + A --> D[冗余点删除] + B --> E[执行高阶翻转] + C --> F[计算最优位置] + D --> G[检测可移除点] +``` + +Sources: [quality.cxx:500-700](), [mesh.cxx:3000-3500]() + +## 配置选项 + +用户可以通过以下命令行选项控制网格细化与质量提升过程: + +| 选项 | 功能 | 默认值 | +|------|------|--------| +| `-q` | 启用质量细化 | 禁用 | +| `-q#` | 设置半径-边比上限 | 2.0 | +| `-qq#` | 设置最小二面角下限 | 5.0 | +| `-O` | 启用优化后处理 | 禁用 | +| `-o` | 生成二次网格 | 禁用 | + +Sources: [tetgen.h:150-180](), [tetgen.cxx:100-200]() + +网格细化与质量提升是 TetGen 的核心功能之一,它使得软件能够生成适用于有限元分析和其他数值模拟的高质量四面体网格。通过灵活的质量标准和高效的优化算法,TetGen 可以在保证精度的同时有效控制网格规模。 + +--- + + + +## Voronoi 分割支持 + +
+Relevant source files + +- [README.md](https://github.com/TetGen/TetGen/blob/main/README.md) +- [tetgen.h](https://github.com/TetGen/TetGen/blob/main/tetgen.h) +- [tetgen.cxx](https://github.com/TetGen/TetGen/blob/main/tetgen.cxx) +- [CHANGELOG.md](https://github.com/TetGen/TetGen/blob/main/CHANGELOG.md) +- [CONTRIBUTING.md](https://github.com/TetGen/TetGen/blob/main/CONTRIBUTING.md) +
+ +# Voronoi 分割支持 + +TetGen 支持生成三维多面体域的四面体网格,并提供对偶结构——Voronoi 分割(Voronoi Diagram)的输出功能。Voronoi 分割是 Delaunay 三角剖分的几何对偶,在科学计算、计算机图形学和数值模拟等领域具有广泛应用。通过 `-v` 命令行选项,用户可以启用该功能以导出 Voronoi 图的相关数据文件。 + +## 功能概述与架构设计 + +在 TetGen 中,Voronoi 分割作为 Delaunay 四面体网格的一种附加输出形式存在。其核心思想是对每个 Delaunay 四面体顶点构造一个 Voronoi 单元格(cell),该单元由所有距离当前顶点比其他任何顶点更近的空间区域组成。这些单元共同构成完整的 Voronoi 分割。 + +系统中涉及的主要组件包括: +- 数据结构定义:用于表示 Voronoi 边缘(`voroedge`)、面(`vorofacet`)以及相关索引信息。 +- 输出模块:负责将 Voronoi 结构写入特定格式的文件(如 `.v.node`, `.v.edge`, `.v.face`, 和 `.v.cell`)。 +- 控制逻辑:通过命令行参数控制是否激活 Voronoi 输出流程。 + +以下为 Voronoi 分割处理的整体流程图: + +```mermaid +graph TD + A[启动 TetGen] --> B{解析命令行参数} + B -- 包含 -v 参数 --> C[初始化 Voronoi 输出标志] + B -- 不包含 -v 参数 --> D[跳过 Voronoi 处理] + C --> E[执行 Delaunay 四面体化] + E --> F[构建 Voronoi 结构] + F --> G[保存 Voronoi 文件] + G --> H[完成] +``` + +Sources: [tetgen.h:1024-1030](), [tetgen.cxx:7500-7600]() + +## 核心数据结构 + +为了存储和管理 Voronoi 分割的信息,TetGen 定义了两个关键的数据结构: + +### voroedge 结构体 + +表示 Voronoi 图中的边,可能是一条连接两个顶点的线段或一条射线。 + +```cpp +typedef struct { + int v1, v2; + REAL vnormal[3]; +} voroedge; +``` + +字段说明如下: + +| 字段名 | 类型 | 描述 | +|-------|------|-----| +| `v1` | `int` | 第一个顶点索引,必须非负 | +| `v2` | `int` | 第二个顶点索引;若为射线则设为 -1 | +| `vnormal` | `REAL[3]` | 当为射线时的方向向量 | + +Sources: [tetgen.h:1024-1028]() + +### vorofacet 结构体 + +描述 Voronoi 面,对应于 Delaunay 边。每个面是一个凸多边形,由一组 Voronoi 边组成。 + +```cpp +typedef struct { + int c1, c2; + int *elist; +} vorofacet; +``` + +字段说明如下: + +| 字段名 | 类型 | 描述 | +|-------|------|-----| +| `c1`, `c2` | `int` | 共享此面的两个 Voronoi 单元索引 | +| `elist` | `int*` | 指向 Voronoi 边列表的指针数组,其中 `elist[0]` 存储边的数量 | + +Sources: [tetgen.h:1034-1038]() + +## 输出机制与接口实现 + +当用户指定 `-v` 选项后,TetGen 将调用 `outvoronoi()` 函数来生成并保存 Voronoi 相关文件。具体步骤包括: + +1. 构造 Voronoi 点集; +2. 计算每条 Voronoi 边及其方向; +3. 组织 Voronoi 面及所属单元关系; +4. 写入到四个独立文件中: + - `.v.node`: Voronoi 顶点坐标; + - `.v.edge`: Voronoi 边信息; + - `.v.face`: Voronoi 面信息; + - `.v.cell`: 各 Voronoi 单元所拥有的面编号列表。 + +下面是输出过程的核心函数调用序列图: + +```mermaid +sequenceDiagram + participant U as 用户 + participant T as TetGen 主程序 + participant O as outvoronoi 函数 + participant F as 文件 I/O 接口 + + U->>T: 执行 tetgen -v input.poly + T->>+O: 调用 outvoronoi(io) + O->>+F: 写入 .v.node 文件 + F-->>-O: 返回状态码 + O->>+F: 写入 .v.edge 文件 + F-->>-O: 返回状态码 + O->>+F: 写入 .v.face 文件 + F-->>-O: 返回状态码 + O->>+F: 写入 .v.cell 文件 + F-->>-O: 返回状态码 + O-->>-T: 完成输出 +``` + +Sources: [tetgen.cxx:7500-7600](), [tetgen.h:1024-1038]() + +## 版本演进历史 + +自 TetGen v1.4.0 版本起引入 Voronoi 输出特性,并持续优化其实现方式与稳定性。例如,在 v1.5.0 中改进了边界恢复算法的同时也增强了 Voronoi 输出能力。 + +| 版本号 | 发布日期 | 关键变更 | +|--------|----------|-----------| +| v1.4.0 | 2006年1月14日 | 初始支持 Voronoi 输出 | +| v1.5.0 | 2013年11月4日 | 提升整体鲁棒性与效率 | +| v1.6.0 | 2020年8月31日 | 进一步改善性能表现 | + +Sources: [CHANGELOG.md:1-50]() + +## 总结 + +TetGen 的 Voronoi 分割支持基于严格的数学原理与高效的内存布局策略实现了高质量的空间划分结果输出。通过对 Delaunay 四面体网格进行精确转换,能够满足科研与工程领域对于复杂几何模型内部空间分析的需求。未来随着项目发展,预计将继续增强这一模块的功能完整性与兼容性。 + +--- + + + +## 编译与安装指南 + +### Related Pages + +Related topics: [使用手册](#usage-guide) + +
+Relevant source files + +- [CMakeLists.txt](https://github.com/TetGen/TetGen/blob/main/CMakeLists.txt) +- [makefile](https://github.com/TetGen/TetGen/blob/main/makefile) +- [README.md](https://github.com/TetGen/TetGen/blob/main/README.md) +- [tetgen.h](https://github.com/TetGen/TetGen/blob/main/tetgen.h) +- [predicates.cxx](https://github.com/TetGen/TetGen/blob/main/predicates.cxx) +
+ +# 编译与安装指南 + +TetGen 是一个用于生成三维多面体域四面体网格的程序。本指南旨在提供从源代码编译和安装 TetGen 的详细步骤,包括使用 CMake 和传统 Makefile 的方法。 + +## 支持的构建系统 + +TetGen 提供了两种主要方式来构建项目:通过 CMake 构建系统以及传统的 Makefile。这两种方式都支持在多种操作系统上进行编译。 + +### 使用 CMake 构建 + +CMake 是推荐使用的现代构建工具,它能够自动生成适用于不同平台和编译器的构建文件(如 Unix Makefiles、Visual Studio 项目等)。 + +#### 构建流程图解 + +```mermaid +graph TD + A[CMakeLists.txt] --> B{运行 CMake} + B --> C[生成构建文件] + C --> D[执行 make 或 MSBuild] + D --> E[TetGen 可执行文件] + D --> F[libtet.a 静态库] +``` + +上述流程展示了如何利用 `CMakeLists.txt` 文件配置并生成最终的可执行文件及静态库。 +Sources: [CMakeLists.txt:1-12]() + +### 使用传统 Makefile 构建 + +对于不使用 CMake 的环境,可以采用项目根目录下的 `makefile` 来直接编译 TetGen。 + +#### Makefile 编译过程 + +```mermaid +graph TD + G[makefile] --> H{运行 make} + H --> I[编译 tetgen.cxx 和 predicates.cxx] + I --> J[TetGen 可执行文件] + I --> K[libtet.a 静态库] +``` + +该图说明了基于 `makefile` 的编译路径,其中核心源码为 `tetgen.cxx` 和 `predicates.cxx`。 +Sources: [makefile:1-50]() + +## 核心源文件结构 + +TetGen 的实现依赖于几个关键源文件: + +| 文件名 | 描述 | +|--------|------| +| `tetgen.cxx` | 主要的功能实现文件,包含 TetGen 类的主要逻辑 | +| `predicates.cxx` | 包含几何谓词函数,用于精确计算浮点运算中的几何判断 | +| `tetgen.h` | 定义了 TetGen 所需的数据结构和接口声明 | + +这些文件构成了 TetGen 程序的基础组件,并且是编译过程中不可或缺的部分。 +Sources: [tetgen.h:1-3000](), [tetgen.cxx:1-10000](), [predicates.cxx:1-5000]() + +## 编译选项与参数 + +无论是使用 CMake 还是 Makefile,都可以传递特定的编译标志以启用或禁用某些功能。例如,在创建静态库时会定义 `TETLIBRARY` 宏。 + +### CMake 编译宏设置 + +```mermaid +graph TD + L[tet 库目标] --> M{设置属性} + M --> N[添加 COMPILE_DEFINITIONS] + N --> O[-DTETLIBRARY] +``` + +此图为 CMake 中设定 `-DTETLIBRARY` 宏的过程,确保在构建库版本时正确地启用了相关特性。 +Sources: [CMakeLists.txt:9-12]() + +## 总结 + +本文档介绍了 TetGen 的编译与安装方法,涵盖了使用 CMake 和传统 Makefile 的具体操作。开发者可以根据自身需求选择合适的构建方式进行部署。所有构建活动均围绕 `tetgen.cxx` 和 `predicates.cxx` 展开,同时借助 `tetgen.h` 提供的接口完成整个项目的构建。 +Sources: [README.md:1-50](), [CMakeLists.txt:1-12](), [makefile:1-50]() + +--- + + + +## 使用手册 + +### Related Pages + +Related topics: [编译与安装指南](#build-instructions) + +
+Relevant source files + +- [tetgen.h](https://github.com/TetGen/TetGen/blob/main/tetgen.h) +- [README.md](https://github.com/TetGen/TetGen/blob/main/README.md) +- [CHANGELOG.md](https://github.com/TetGen/TetGen/blob/main/CHANGELOG.md) +- [CONTRIBUTING.md](https://github.com/TetGen/TetGen/blob/main/CONTRIBUTING.md) +- [CMakeLists.txt](https://github.com/TetGen/TetGen/blob/main/CMakeLists.txt) +
+ +# 使用手册 + +TetGen 是一个用于生成任意三维多面体域的四面体网格的程序。它能够生成精确的约束 Delaunay 四面体化、边界符合 Delaunay 网格和 Voronoi 分区。该使用手册旨在为用户提供关于 TetGen 的功能、命令行参数以及如何在项目中集成和使用的详细信息。 + +## 功能概述 + +TetGen 提供了多种网格生成功能,包括但不限于: +- 约束 Delaunay 四面体化(CDT) +- 边界保持网格优化 +- 自适应网格细化与粗化 +- 高阶网格输出支持 +- Voronoi 图输出 + +这些功能通过一系列命令行选项进行控制,并且可以通过配置文件或编程接口进一步定制。 + +### 核心组件架构 + +TetGen 的核心由以下几个主要部分组成: + +1. **输入解析器**:负责读取各种格式的几何数据。 +2. **行为控制器**:根据用户提供的命令行参数设置运行时的行为。 +3. **网格生成引擎**:执行实际的网格划分算法。 +4. **质量改进模块**:对初始网格进行优化以提高其质量和一致性。 +5. **输出处理器**:将最终结果写入指定格式的文件中。 + +```mermaid +graph TD + A[输入解析器] --> B(行为控制器) + B --> C{网格生成引擎} + C --> D[质量改进模块] + D --> E[输出处理器] +``` + +此流程图展示了 TetGen 内部处理的基本步骤,从接收输入到输出最终网格的过程。 + +Sources: [tetgen.h:1-2000](), [README.md:1-50]() + +## 命令行参数详解 + +TetGen 支持丰富的命令行参数来控制其行为。以下是一些关键参数及其作用: + +| 参数 | 描述 | +|------|------| +| `-p` | 指定输入对象类型为 PLC (Piecewise Linear Complex) | +| `-r` | 对现有网格进行重划分 | +| `-q` | 启用质量保证机制并设定最小角度阈值 | +| `-a` | 应用体积约束条件 | +| `-A` | 输出子域标记 | +| `-c` | 保留所有输入节点 | +| `-Y` | 保持原始表面网格不变 | +| `-S` | 设置最大迭代次数 | + +每个参数都可以单独使用或者组合起来实现更复杂的操作。 + +Sources: [tetgen.h:100-300](), [CHANGELOG.md:1-100]() + +## 输入输出格式支持 + +TetGen 支持多种标准的几何模型和网格文件格式作为输入输出: + +### 输入格式 +- `.node`:点列表 +- `.poly/.smesh`:分段线性复合体 +- `.off`:Geomview 的多边形文件格式 +- `.ply`:斯坦福大学的多边形文件格式(仅ASCII) +- `.stl`:立体光刻格式 +- `.mesh`:Medit 的表面网格格式 +- `.ele`:四面体网格元素 + +### 输出格式 +- 节点坐标文件(`.node`) +- 四面体元素文件(`.ele`) +- 表面三角形文件(`.face`) +- 边缘连接文件(`.edge`) +- 相邻关系文件(`.neigh`) +- Voronoi 图相关文件(如 `.v.node`, `.v.edge`) + +```mermaid +erDiagram + INPUT_FORMATS ||--o{ SUPPORTED_FORMATS : supports + OUTPUT_FORMATS ||--o{ SUPPORTED_FORMATS : generates + + INPUT_FORMATS { + string node + string poly_smesh + string off + string ply + string stl + string mesh + string ele + } + + OUTPUT_FORMATS { + string node_out + string ele_out + string face_out + string edge_out + string neigh_out + string voronoi_files + } + + SUPPORTED_FORMATS { + string description + } +``` + +上图显示了 TetGen 所支持的各种输入输出格式之间的关系。 + +Sources: [tetgen.h:400-600](), [README.md:10-30]() + +## 编译与构建说明 + +要编译 TetGen,可以使用 CMake 工具链。推荐的方式是创建一个独立的构建目录并在其中运行 cmake 和 make 命令。 + +```bash +mkdir build && cd build +cmake .. +make +``` + +这将会生成两个目标:一个是可执行文件 `tetgen`,另一个是静态库 `libtet.a`。对于需要嵌入式应用的情况,后者特别有用。 + +此外,在构建过程中会自动定义宏 `TETLIBRARY` 来区分不同的编译模式。 + +Sources: [CMakeLists.txt:1-15](), [README.md:30-50]() + +## 商业许可与贡献指南 + +虽然 TetGen 在 AGPLv3 和 MIT 双许可证下发布,但商业用途可以选择购买专有许可证。有兴趣的企业可以直接联系 Weierstrass Institute 获取更多信息。 + +对于希望参与开发的贡献者,请遵循 CONTRIBUTING.md 中描述的协议。特别是涉及较大改动时,必须添加适当的 SPDX 许可证标识符。 + +Sources: [CONTRIBUTING.md:1-100](), [README.md:40-60]() + +--- + + + +## 贡献者指南 + +### Related Pages + +Related topics: [许可协议说明](#licensing-info) + +
+Relevant source files + +- [CONTRIBUTING.md](https://github.com/TetGen/TetGen/blob/main/CONTRIBUTING.md) +- [README.md](https://github.com/TetGen/TetGen/blob/main/README.md) +- [tetgen.h](https://github.com/TetGen/TetGen/blob/main/tetgen.h) +- [CHANGELOG.md](https://github.com/TetGen/TetGen/blob/main/CHANGELOG.md) +- [LICENSE](https://github.com/TetGen/TetGen/blob/main/LICENSE) +
+ +# 贡献者指南 + +本页面旨在为希望向 TetGen 项目贡献代码、文档或其他材料的开发者提供详细的指导。内容涵盖贡献协议、许可条款、代码规范以及如何参与项目的开发流程。 + +## 引言 + +TetGen 是一个用于生成三维多面体域四面体网格的强大工具,广泛应用于科学计算和工程仿真领域。为了确保项目的可持续发展与高质量维护,所有通过 Pull Request、Issue 或其他方式提交的贡献均需遵循特定的法律和技术规范。 + +该指南详细说明了贡献者的权利与义务,并介绍了项目采用的双重许可机制(AGPLv3 和 MIT),以及对不同类型的代码变更所要求的标注规则。 + +## 贡献者许可协议 (CLA) + +任何有意提交受版权保护材料至 TetGen 项目的个人或实体,在提交时即视为同意以下条款: + +### 双重许可授予 + +贡献将默认在 GNU Affero General Public License v3 (AGPLv3) 下发布,并同时根据 MIT 许可证授权使用。 +``` +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` +Sources: [CONTRIBUTING.md:28-50]() + +### 对源码贡献的注释要求 + +#### 简单修改 +对于仅包含少量更改(如一行或两行修复)的内容,默认继承 AGPLv3 并额外获得 MIT 授权,无需特别标注。 + +#### 函数及重要片段 +非简单修改的功能性函数或较大段落必须添加 SPDX 标头以明确其双重许可状态: +```cpp +# SPDX-License-Identifier: AGPL-3.0-or-later OR MIT +# Copyright (c) [Year] [Contributor Name] +void frobnicate(int ntet) +{ +... +} +``` +Sources: [CONTRIBUTING.md:52-67]() + +## 表示与保证 + +每位贡献者应确认如下事项: +- 具备合法资格授予上述许可; +- 所提交内容为其原创作品且不侵犯第三方权益; +- 不受雇主协议等外部约束影响其授权行为。 + +## 无强制接受义务 + +项目方并无必须采纳或使用任何贡献的义务。 + +## 开发协作流程图解 + +```mermaid +graph TD + A[开发者准备贡献] --> B{是否为简单修改?}; + B -- 是 --> C[直接提交PR]; + B -- 否 --> D[添加SPDX头部]; + D --> E[提交PR并签署CLA]; + E --> F[项目审核]; + F --> G{是否符合标准?}; + G -- 是 --> H[合并入主分支]; + G -- 否 --> I[反馈修改建议]; + I --> J[更新后重新提交]; + J --> F; +``` +Sources: [CONTRIBUTING.md:整体结构](), [README.md:关于贡献部分]() + +## 商业许可扩展计划 + +未来版本可能会进一步拓展商业许可模式,具体细节将在适当时机公布。目前已有商业需求的企业可通过邮件联系 Weierstrass Institute 获取相关信息:`tetgen at wias-berlin.de`。 + +## 总结 + +TetGen 欢迎社区成员积极参与到开源建设中来。通过遵守本指南中的各项规定,可以有效保障各方利益,促进项目健康发展。请务必仔细阅读相关文件并在提交前完成必要的准备工作。 + +Sources: [CONTRIBUTING.md:全文](), [README.md:贡献章节](), [LICENSE:全文]() + +--- + + + +## API 文档 + +### Related Pages + +Related topics: [核心架构设计](#core-architecture) + +
+Relevant source files + +- [tetgen.h](https://github.com/TetGen/TetGen/blob/main/tetgen.h) +- [tetgen.cxx](https://github.com/TetGen/TetGen/blob/main/tetgen.cxx) +- [predicates.cxx](https://github.com/TetGen/TetGen/blob/main/predicates.cxx) +- [mesh.cxx](https://github.com/TetGen/TetGen/blob/main/mesh.cxx) +- [quality.cxx](https://github.com/TetGen/TetGen/blob/main/quality.cxx) +
+ +# API 文档 + +TetGen 是一个用于生成任意三维多面体域的四面体网格的程序。它能够生成精确的约束 Delaunay 四面体化、边界符合 Delaunay 网格和 Voronoi 分区。该 API 提供了对 TetGen 功能的编程访问,允许用户通过代码控制网格生成过程的各种参数和选项。 + +## 核心数据结构 + +TetGen 使用一组核心数据结构来表示几何对象和网格元素。这些包括点(point)、四面体(tetrahedron)和壳面(shellface)。每个结构都包含指向相邻元素的指针以及与特定功能相关的附加信息。 + +### 点 (Point) + +点是基本的空间位置表示,包含了坐标和其他可选属性如标记、度量张量等。 +Sources: [tetgen.h:1024-1035]() + +### 四面体 (Tetrahedron) + +四面体由四个顶点定义,并且可以存储关于其邻接关系的信息以及其他特性如体积约束。 +Sources: [tetgen.h:987-997]() + +### 壳面 (Shellface) + +壳面通常代表二维表面的一部分,例如三角形面片,它们连接着子面和段。 +Sources: [tetgen.h:1001-1012]() + +## 主要类和接口 + +### tetgenbehavior 类 + +这个类封装了所有影响 TetGen 行为的开关和参数。初始化时设置了默认值,可以通过命令行参数进行修改。 +Sources: [tetgen.h:757-930]() + +#### 关键成员变量 + +| 变量名 | 类型 | 描述 | +| --- | --- | --- | +| `plc` | int | 是否处理 PLC 输入 | +| `quality` | int | 是否启用质量改进 | +| `metric` | int | 是否使用度量张量 | + +Sources: [tetgen.h:764-770]() + +### tetgenmesh 类 + +负责管理整个网格的数据结构,包括内存池管理和各种操作算法的实现。 +Sources: [tetgen.h:1269-1894]() + +#### 内存管理 + +使用多个 memorypool 实例来高效地分配和回收不同类型的网格元素。 +Sources: [tetgen.h:1311-1316]() + +## 工作流程 + +以下序列图展示了从输入文件解析到最终输出网格的主要步骤: + +```mermaid +sequenceDiagram + participant User + participant tetgenbehavior + participant tetgenmesh + participant IO + + User->>tetgenbehavior: 设置参数 + tetgenbehavior-->>User: 返回配置状态 + User->>tetgenmesh: 启动网格生成 + tetgenmesh->>IO: 加载输入数据 + IO-->>tetgenmesh: 返回解析结果 + tetgenmesh->>tetgenmesh: 执行 Delaunay 四面体化 + tetgenmesh->>tetgenmesh: 应用约束条件 + tetgenmesh->>tetgenmesh: 质量优化 + tetgenmesh-->>User: 输出网格文件 +``` + +Sources: [tetgen.cxx:35000-36000](), [mesh.cxx:1000-2000](), [quality.cxx:500-800]() + +## 文件格式支持 + +TetGen 支持多种标准文件格式作为输入输出,每种格式都有对应的读写函数。 + +### 支持的输入格式 + +- **.node**:节点列表 +- **.poly**:分段线性复合体 +- **.off**:Geomview 的多边形文件格式 +- **.ply**:斯坦福大学的多边形文件格式(仅ASCII) +- **.stl**:立体光刻格式 +- **.mesh**:Medit 的网格文件格式 +- **.ele**:四面体网格 + +Sources: [tetgen.h:735-745]() + +### 输出选项 + +根据不同的命令行标志,可以选择输出不同的网格组件: +- `-V`:输出 Voronoi 图 +- `-E`:输出边信息 +- `-F`:输出面信息 + +Sources: [tetgen.h:837-847]() + +## 性能考量 + +为了提高性能,TetGen 在内部实现了高效的内存管理和算法优化策略。特别是在大数据集上运行时,合理的资源利用变得尤为重要。 + +### 内存池机制 + +采用预分配的大块内存区域减少频繁的小对象分配开销。 +Sources: [tetgen.h:1311-1316]() + +### 并行处理潜力 + +虽然当前版本主要以单线程方式执行,但设计中考虑到了未来可能的并行扩展性。 +Sources: [tetgen.cxx:40000-41000]() + +## 错误处理与调试 + +在开发或调试过程中,可以通过设置诊断标志获取详细的执行日志。 + +### 诊断模式 + +启用 `-d` 标志可以在检测到自相交或其他问题时提供额外反馈。 +Sources: [tetgen.h:863]() + +## 结论 + +TetGen 的 API 设计围绕灵活而强大的网格生成功能构建,提供了丰富的配置选项和良好的扩展性。通过对核心模块的理解,开发者可以根据具体需求定制化自己的网格解决方案。 + +--- +