2
Home
admin edited this page 2026-03-05 00:47:34 +08:00
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Wiki Documentation for https://github.com/TetGen/TetGen

Generated on: 2026-03-03 02:10:13

Table of Contents

项目简介

Related topics: 许可协议说明

Relevant source files

项目简介

TetGen 是一个用于生成任意三维多面体域四面体网格的程序。它能够生成精确的约束 Delaunay 四面体化、边界符合 Delaunay 网格以及 Voronoi 分区。该项目由 Hang Si 主导开发并与柏林魏尔施特拉斯应用分析与随机研究所WIAS合作维护。

TetGen 支持多种输入格式,包括点列表(.node、线性复合体.poly 或 .smesh、OFF 格式Geomview 的文件格式、PLY 格式(仅 ASCII、STL 格式立体光刻格式、MEDIT 格式(.mesh、VTK 格式和 NEU 格式等。输出功能同样丰富,支持节点、元素、面、边、邻居关系及 Voronoi 图等多种数据结构的导出。

架构概述

TetGen 的核心架构围绕着几个关键的数据结构和算法实现展开:

  • tetgenbehavior:定义了命令行参数解析逻辑和行为配置。
  • tetgenmesh:管理整个网格的数据结构,包括点、四面体、子面和段落等。
  • memorypoolarraypool:高效的内存池机制,用于存储网格元素及其附加信息。
  • badface:表示质量不佳或被侵犯的元素,用于优先队列排序以优化网格质量。
  • point, tetrahedron, shellface:基本几何对象的数据结构封装。

数据流图解

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 性质)

核心方法序列图

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.0TetGen 不断引入新特性并修复已知问题。例如在 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 topics: 项目简介, 贡献者指南

Relevant source files

许可协议说明

TetGen 是一个用于生成三维多面体域四面体网格的程序其开发和分发遵循特定的许可协议。这些协议不仅定义了用户如何合法地使用该软件还规定了贡献者在提交代码时需要遵守的条款。TetGen 的许可策略采用双许可模式GNU Affero 通用公共许可证第 3 版AGPLv3以及 MIT 许可证。

双重许可模型

TetGen 使用双重许可模型来满足不同用户的法律需求。默认情况下,所有贡献都必须同意将作品提供给项目 under AGPLv3 或后续版本,并且同时授予 MIT 许可下的使用权。这种安排允许更广泛的社区访问并促进开源协作,同时也为商业用户提供替代方案。

AGPLv3 许可证

AGPLv3 是一种 copyleft 许可证,它要求任何基于 TetGen 修改或衍生的作品也必须以相同的许可证发布。这意味着如果开发者修改了 TetGen 并将其作为网络服务的一部分进行部署,则他们必须公开源代码。

MIT 许可证

MIT 许可是一种宽松的自由软件许可协议,允许对软件进行任意修改、再发行及用于商业用途,只要保留原始版权声明即可。这使得 TetGen 能够被集成到专有软件中而无需强制开放源码。

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.0TetGen 的许可由带有非商业条款的 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

版本更新日志摘要

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 选项的行为,在约束四面体化过程中直接检测输入表面网格中的自相交问题。
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 选项)。
  • 完全支持孤立线段及其标记。
  • 新增多个用于改善网格质量和优化的选项及参数。
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 文件格式。
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 开关,使输出节点索引可以从零开始。
  • 修复了许多已知错误。
  • 更正了用户手册中的一些拼写错误。
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。
graph TD
    AE[TetGen 1.4.1 更新] --> AF[适应性网格细化算法]
    AE --> AG[-Y 选项改进]
    AE --> AH[修复多个 Bug]

Sources: CHANGELOG.md:69-79

总结

通过对 TetGen 多个版本的日志分析可以看出,该项目持续致力于算法层面的创新与优化,特别是在 Delaunay 四面体化、边界恢复、网格细化和平滑等方面取得了显著进展。这些不断迭代的技术进步确保了 TetGen 能够高效且准确地处理各种复杂的三维几何建模任务。同时,开源社区的支持也促进了项目的健康发展,使得更多研究人员和工程师能够受益于高质量的网格生成功能。


核心架构设计

Related topics: 关键数据结构

Relevant source files

核心架构设计

TetGen 是一个用于生成三维多面体域四面体网格的程序。其核心架构围绕着精确约束 Delaunay 四面体化、边界一致 Delaunay 网格和 Voronoi 分区等算法构建,旨在提供高质量且适应性强的网格生成能力。

该系统通过命令行参数控制行为,并支持多种输入输出格式(如 .node, .poly, .off, .ply, .stl, .mesh, .ele)。整个架构由多个模块组成,包括几何处理、内存管理、网格优化以及用户接口等部分。

主要组件与数据结构

数据表示层

TetGen 使用一系列基础数据结构来表示点、边、面和四面体:

  • point: 表示空间中的顶点,包含坐标信息及附加属性。
  • tetrahedron: 四面体的基本单元,存储四个顶点指针及相关邻接关系。
  • shellface: 子面或壳面结构,描述三角形表面及其相邻元素。
  • memorypool: 内存池机制用于高效分配和回收上述对象。

这些结构在 tetgen.h 中定义并贯穿于整个代码库中使用。

类图示意

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

控制逻辑层

主控类为 tetgenbehaviortetgenmesh,分别负责解析命令行选项和执行实际的网格操作。

  • tetgenbehavior: 解析命令行开关,设定运行时参数。
  • tetgenmesh: 执行具体的网格构造、细化、平滑等功能。

这两个类之间的交互构成了 TetGen 的主要工作流程。

工作流顺序图

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)、更新连接关系等步骤。

流程图解

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 细化算法进行质量提升,确保最小角度满足要求并通过优先队列管理坏质量单元。

操作优先级模型

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 点以保证约束条件成立。

插入策略决策树

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 topics: 关键数据结构

Relevant source files

输入输出数据结构

TetGen 是一个用于生成三维多面体域四面体网格的程序。其核心功能依赖于精确的数据结构来表示输入几何和输出网格。这些数据结构不仅定义了点、边、面和体的拓扑关系,还支持多种文件格式的读取与写入。理解 TetGen 的输入输出数据结构对于开发者扩展功能或用户自定义接口至关重要。

核心数据类型

TetGen 使用一组基础数据结构来描述几何对象及其属性:

  • point: 表示空间中的顶点坐标及相关信息。
  • tetrahedron: 描述由四个顶点组成的四面体单元。
  • shellface: 定义二维边界元素(如三角形面)。
  • memorypool: 管理内存分配以优化性能。

点 (point) 结构

每个点包含以下字段:

  • 坐标值 (x, y, z)
  • 用户定义的浮点属性列表(可选)
  • 参数化坐标 u, v用于表面映射
  • 度量张量(用于质量控制)
  • 指向相邻四面体的指针
  • 边界标记等附加信息
typedef REAL *point;

该结构在运行时动态确定大小,并通过索引访问各个字段。

Sources: tetgen.h:1024-1035

四面体 (tetrahedron) 结构

四面体是 TetGen 中的基本体积单元,存储如下内容:

  • 四个顶点索引
  • 六条边上可能存在的高阶节点(当启用 -o2 选项时)
  • 相邻四面体的信息
  • 属性及标志位
typedef REAL **tetrahedron;

Sources: tetgen.h:987-997

边界面 (shellface) 结构

用于表示模型边界上的三角形面片,包括:

  • 三个顶点
  • 邻接的其他边界面
  • 关联的线段信息
  • 所属的两个四面体
  • 区域约束(如有)
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

数据流图解

下面展示了从输入到输出的主要流程:

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 topics: 核心架构设计, 输入输出数据结构

Relevant source files

关键数据结构

TetGen 是一个用于生成三维多面体域四面体网格的程序。其核心功能依赖于一系列精心设计的数据结构,这些数据结构不仅支持高效的内存管理,还确保了算法实现的准确性和鲁棒性。本文档将详细介绍 TetGen 中的关键数据结构及其在项目中的作用。

Point

点是 TetGen 中最基本的几何元素之一,它包含了坐标信息以及可能的属性、度量张量等附加信息。每个点通过一个 REAL* 类型指针表示,实际大小根据运行时配置确定。 Sources: tetgen.h:1-1000

结构定义

typedef REAL *point;

Sources: tetgen.h:200-201

点结构包括:

  • x, y 和 z 坐标;
  • 用户定义的点属性列表(可选);
  • u, v 参数化坐标(可选,用于 -s 开关);
  • 度量张量(可选,用于 -q-m 开关);
  • 指向邻近四面体的指针;
  • 指向父节点或重复节点的指针;
  • 指向背景网格中四面体的指针(可选,用于 -m 开关);
  • 边界标记整数(点索引);
  • 几何标签整数(可选,用于 -s 开关);

四面体Tetrahedron

四面体由四个顶点组成,并且可以包含额外的信息如属性和约束体积。它们构成了整个四面体网格的基础单元。 Sources: tetgen.h:1-1000

结构定义

typedef REAL **tetrahedron;

Sources: tetgen.h:150-151

四面体结构包括:

  • 相邻四面体列表;
  • 顶点列表;
  • 面列表;
  • 区域约束(可选,用于 -a 开关);
  • 元素标记整数;
  • 标志位等其他信息;

子面Subface

子面代表网格边界上的三角形面片,通常与输入表面网格相关联。它记录了相邻子面、顶点及边的信息。 Sources: tetgen.h:1-1000

结构定义

typedef REAL **shellface;

Sources: tetgen.h:175-176

子面结构包括:

  • 相邻子面列表;
  • 顶点列表;
  • 相邻线段列表;
  • 相邻四面体对;
  • 面积约束(可选,用于 -q 开关);
  • 边界标记整数;
  • 类型标志等信息;

内存池Memory Pool

为了高效地管理和分配大量相似对象例如点、四面体TetGen 使用内存池机制来减少动态内存分配带来的开销。 Sources: tetgen.h:1-1000

主要用途

  • 存储网格元素(点、四面体、子面和线段)
  • 存储四面体与其他元素之间的额外连接关系

示例代码片段

memorypool *tetrahedrons, *subfaces, *subsegs, *points;

Sources: tetgen.h:300-301

行为控制Behavior Control

tetgenbehavior 结构体封装了所有影响 TetGen 运行行为的开关和参数。这些设置可以通过命令行参数进行初始化。 Sources: tetgen.h:1-1000

初始化示例

tetgenbehavior()
{
  plc = 0;
  psc = 0;
  refine = 0;
  quality = 0;
  ...
}

Sources: tetgen.h:400-450

该结构允许用户指定诸如是否使用 PLCPiecewise Linear Complex、是否优化质量、是否细化网格等多种选项。

总结

上述数据结构共同构成了 TetGen 强大而灵活的核心框架,使得它可以处理从简单到复杂的各种三维几何模型,并生成高质量的四面体网格。通过对这些基础组件的理解,开发者能够更好地利用 TetGen 的功能或者对其进行扩展开发。


Delaaunay 四面体化算法

Related topics: 网格细化与质量提升

Relevant source files

Delaaunay 四面体化算法

Delaunay 四面体化是 TetGen 库的核心功能之一,用于在三维空间中生成任意多面体域的四面体网格。该算法基于精确的约束 Delaunay 四面体化Constrained Delaunay Tetrahedralization, CDT和边界一致的 Delaunay 网格技术,确保生成高质量且符合几何边界的四面体网格。

核心数据结构与组件

TetGen 使用多个关键的数据结构来支持 Delaunay 四面体化的实现:

  • tetrahedron: 表示一个四面体的基本单元。
  • shellface: 描述子面(如三角形面片),通常用于表示边界或约束表面。
  • point: 存储顶点坐标及相关属性信息。
  • memorypool: 内存池管理器,高效地分配和回收各种类型的网格元素内存。

这些结构通过指针相互连接以构建完整的四面体网络拓扑关系。

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) 来快速定位并更新受影响区域内的四面体结构。

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)解决退化问题。

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 细化算法扩展版本,在不依赖于输入角度限制的前提下,能够依据尺寸函数自动生成满足特定质量要求的网格。

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 topics: Delaaunay 四面体化算法

Relevant source files

网格细化与质量提升

TetGen 中的网格细化与质量提升功能旨在通过自适应算法生成高质量的四面体网格。该过程基于约束 Delaunay 四面体化CDT和 Delaunay 细化技术,结合多种优化策略来改善网格元素的质量并控制网格尺寸。

核心组件与数据结构

TetGen 使用多个核心类和数据结构来实现网格细化与质量提升:

  • tetgenbehavior: 存储命令行参数和行为配置。
  • tetgenmesh: 表示整个网格结构,包括点、四面体、子面等。
  • memorypool: 用于高效管理网格元素内存。
  • badface: 用于存储低质量或被侵犯的网格元素信息。
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. 更新网格统计信息
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() 函数中进行计算和验证。

graph TD
    A[质量检查] --> B[计算半径-边比]
    B --> C[计算最小二面角]
    C --> D{满足质量要求?}
    D -->|否| E[加入细化队列]
    D -->|是| F[标记为合格]

Sources: quality.cxx:100-300

Steiner 点插入策略

为了提高网格质量TetGen 实现了多种 Steiner 点插入策略:

  • Off-center 点:减少所需插入点数量
  • Circumcenter 点:确保 Delaunay 性质
  • 加权点:根据局部几何特征调整位置
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()
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

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 分割处理的整体流程图:

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 图中的边,可能是一条连接两个顶点的线段或一条射线。

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 边组成。

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 单元所拥有的面编号列表。

下面是输出过程的核心函数调用序列图:

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 topics: 使用手册

Relevant source files

编译与安装指南

TetGen 是一个用于生成三维多面体域四面体网格的程序。本指南旨在提供从源代码编译和安装 TetGen 的详细步骤,包括使用 CMake 和传统 Makefile 的方法。

支持的构建系统

TetGen 提供了两种主要方式来构建项目:通过 CMake 构建系统以及传统的 Makefile。这两种方式都支持在多种操作系统上进行编译。

使用 CMake 构建

CMake 是推荐使用的现代构建工具,它能够自动生成适用于不同平台和编译器的构建文件(如 Unix Makefiles、Visual Studio 项目等)。

构建流程图解

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 编译过程

graph TD
    G[makefile] --> H{运行 make}
    H --> I[编译 tetgen.cxx 和 predicates.cxx]
    I --> J[TetGen 可执行文件]
    I --> K[libtet.a 静态库]

该图说明了基于 makefile 的编译路径,其中核心源码为 tetgen.cxxpredicates.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 编译宏设置

graph TD
    L[tet 库目标] --> M{设置属性}
    M --> N[添加 COMPILE_DEFINITIONS]
    N --> O[-DTETLIBRARY]

此图为 CMake 中设定 -DTETLIBRARY 宏的过程,确保在构建库版本时正确地启用了相关特性。 Sources: CMakeLists.txt:9-12

总结

本文档介绍了 TetGen 的编译与安装方法,涵盖了使用 CMake 和传统 Makefile 的具体操作。开发者可以根据自身需求选择合适的构建方式进行部署。所有构建活动均围绕 tetgen.cxxpredicates.cxx 展开,同时借助 tetgen.h 提供的接口完成整个项目的构建。 Sources: README.md:1-50, CMakeLists.txt:1-12, makefile:1-50


使用手册

Related topics: 编译与安装指南

Relevant source files

使用手册

TetGen 是一个用于生成任意三维多面体域的四面体网格的程序。它能够生成精确的约束 Delaunay 四面体化、边界符合 Delaunay 网格和 Voronoi 分区。该使用手册旨在为用户提供关于 TetGen 的功能、命令行参数以及如何在项目中集成和使用的详细信息。

功能概述

TetGen 提供了多种网格生成功能,包括但不限于:

  • 约束 Delaunay 四面体化CDT
  • 边界保持网格优化
  • 自适应网格细化与粗化
  • 高阶网格输出支持
  • Voronoi 图输出

这些功能通过一系列命令行选项进行控制,并且可以通过配置文件或编程接口进一步定制。

核心组件架构

TetGen 的核心由以下几个主要部分组成:

  1. 输入解析器:负责读取各种格式的几何数据。
  2. 行为控制器:根据用户提供的命令行参数设置运行时的行为。
  3. 网格生成引擎:执行实际的网格划分算法。
  4. 质量改进模块:对初始网格进行优化以提高其质量和一致性。
  5. 输出处理器:将最终结果写入指定格式的文件中。
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:分段线性复合体
  • .offGeomview 的多边形文件格式
  • .ply斯坦福大学的多边形文件格式仅ASCII
  • .stl:立体光刻格式
  • .meshMedit 的表面网格格式
  • .ele:四面体网格元素

输出格式

  • 节点坐标文件(.node
  • 四面体元素文件(.ele
  • 表面三角形文件(.face
  • 边缘连接文件(.edge
  • 相邻关系文件(.neigh
  • Voronoi 图相关文件(如 .v.node, .v.edge
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 命令。

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 topics: 许可协议说明

Relevant source files

贡献者指南

本页面旨在为希望向 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 标头以明确其双重许可状态:

# SPDX-License-Identifier: AGPL-3.0-or-later OR MIT
# Copyright (c) [Year] [Contributor Name]
void frobnicate(int ntet)
{
...
}

Sources: CONTRIBUTING.md:52-67

表示与保证

每位贡献者应确认如下事项:

  • 具备合法资格授予上述许可;
  • 所提交内容为其原创作品且不侵犯第三方权益;
  • 不受雇主协议等外部约束影响其授权行为。

无强制接受义务

项目方并无必须采纳或使用任何贡献的义务。

开发协作流程图解

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 topics: 核心架构设计

Relevant source files

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

工作流程

以下序列图展示了从输入文件解析到最终输出网格的主要步骤:

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:分段线性复合体
  • .offGeomview 的多边形文件格式
  • .ply斯坦福大学的多边形文件格式仅ASCII
  • .stl:立体光刻格式
  • .meshMedit 的网格文件格式
  • .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 设计围绕灵活而强大的网格生成功能构建,提供了丰富的配置选项和良好的扩展性。通过对核心模块的理解,开发者可以根据具体需求定制化自己的网格解决方案。