# TriangulateWall.hpp 头文件解析
## 概述
本头文件实现二维多边形间的三维墙面三角剖分算法,主要用于3D打印中连接不同Z高度的轮廓层,生成垂直方向的支撑结构或封闭表面。
## 核心结构解析
### 1. Ring环状索引管理器
```cpp
class Ring {
size_t idx, nextidx, startidx, begin, end; // 当前/下一个索引,起始/终止索引
public:
explicit Ring(size_t from, size_t to); // 初始化索引范围
void inc(); // 步进到下一个索引
bool is_finished() const; // 判断循环是否完成
};
- 功能:
- 管理多边形顶点的环状遍历
- 处理索引回绕(到达末端后回到起点)
- 支持正向/反向遍历控制
2. Triangulator三角剖分器
template<class Sc>
class Triangulator {
const vector<Vec3<Sc>>* pts; // 三维顶点数据
Ring *onring, *offring; // 当前处理环/辅助环
double calc_score(); // 计算当前边组合的质量得分
void synchronize_rings(); // 同步双环最优起始位置
public:
void run(vector<Vec3i>& indices); // 执行剖分生成三角形索引
};
- 算法流程:
- 同步双环起始位置找到最佳匹配点
- 循环选择得分更优的边组合
- 生成三角形索引并更新环状态
关键算法实现
质量评分函数
Sc trscore(const Ring& on, const Ring& off, const vector<Vec3<Sc>>& pts) {
Sc a = 边AB长度平方;
Sc b = 边BC长度平方;
return (a + b)/2; // 平均边长为评分依据
}
- 目标:最小化三角形边长方差
- 作用:优先生成近似等边的三角形
同步双环机制
确保上下层多边形顶点最优对齐,避免扭曲三角形
主要接口函数
triangulate_wall
template<class Sc, class I>
void triangulate_wall(
vector<Vec3<Sc>>& pts, // 输出顶点集
vector<Vec3<I>>& ind, // 输出三角形索引
const Polygon& lower, // 下层轮廓
const Polygon& upper, // 上层轮廓
double lower_z, // 下层Z高度
double upper_z // 上层Z高度
);
- 处理流程:
- 将二维多边形点升维到指定Z高度
- 合并生成三维顶点数组(下层点在前,上层在后)
- 初始化双环管理器(下层环/上层环)
- 执行三角剖分生成连接两层的三角形
设计亮点
三维空间投影
- 二维多边形点通过
unscaled()
转换为真实坐标 - Z轴分层实现三维墙面构建
模板化设计
- 支持多种数值类型(float/double)
- 适配不同索引类型(int32_t/int64_t)
循环优化
- 避免重复计算:预存顶点数据指针
- 最小化内存分配:reserve预分配容器空间
应用场景
3D打印典型应用
- 垂直支撑生成:连接不同层的外轮廓
- 中空模型封顶:填补上下封闭层间的空隙
- 倾斜结构重建:处理非平面层间的过渡表面
使用示例
Polygon lower = ...; // 下层轮廓
Polygon upper = ...; // 上层轮廓
vector<Vec3d> vertices;
vector<Vec3i> indices;
triangulate_wall(vertices, indices, lower, upper, 10.0, 15.0);
// vertices包含所有三维点,indices为三角形面片索引
本算法通过优化的环状遍历策略和质量评分机制,在保证生成网格质量的同时,有效处理了复杂多边形的三角剖分问题,为3D打印中的垂直结构生成提供了可靠解决方案。