# Slic3r_Measure.hpp 代码分析
## 核心功能模块
### 几何特征定义 (SurfaceFeature)
```cpp
enum class SurfaceFeatureType {
Undef, Point, Edge, Circle, Plane
};
class SurfaceFeature {
// 存储点、边、圆、平面等几何特征
// 支持坐标变换、特征克隆、比较操作
// 包含关联的网格数据指针及变换矩阵
};
- 数据结构:
- 点:单点坐标
- 边:起点+终点
- 圆:中心+法向+半径
- 平面:法向+基点
- 关键方法:
translate()
实现坐标变换operator==
处理浮点精度比较
测量核心类 (Measuring)
class Measuring {
// 基于三角网格构建测量系统
// 提供特征提取接口
private:
std::unique_ptr<MeasuringImpl> priv; // PIMPL模式隐藏实现
};
- 主要接口:
get_feature()
根据面索引获取特征get_plane_triangle_indices()
获取平面三角形索引
测量结果结构
struct MeasurementResult {
std::optional<AngleAndEdges> angle; // 角度测量
std::optional<DistAndPoints> distance; // 距离测量
// 包含三种距离测量模式:无限延申/严格边界/三维分量
};
支持多类型测量结果存储,适应不同测量需求
关键算法实现
几何关系判断
bool are_parallel(const Vec3d&, const Vec3d&); // 向量平行判断
bool are_perpendicular(const Vec3d&, const Vec3d&); // 向量垂直判断
- 使用点积运算结合EPSILON处理浮点精度
测量计算函数
MeasurementResult get_measurement(const SurfaceFeature&, const SurfaceFeature&);
- 处理不同特征组合的测量逻辑:
- 点-点:直线距离
- 边-边:角度/最短距离
- 平面-平面:夹角/距离
设计亮点
多测量模式支持
测量模式 | 描述 |
---|---|
无限延申距离 | 忽略物体边界,计算特征间最短距离 |
严格边界距离 | 考虑物体实际形状的最近距离 |
三维分量距离 | XYZ轴方向分解距离 |
装配动作建议
struct AssemblyAction {
bool can_set_parallel; // 是否可设为平行
bool can_set_center_coincide; // 是否可中心对齐
Transform3d transform; // 建议变换矩阵
};
基于测量结果提供智能装配建议,提升用户操作效率
性能优化点
数据局部性优化:
- SurfaceFeature使用紧凑存储(40字节+可选指针)
- 特征比较使用快速近似判断
并行计算准备:
- PIMPL模式隔离实现,便于未来并行化扩展
- 特征提取算法复杂度O(n)~O(n log n)
几何计算加速:
inline Vec3d edge_direction(...) // 快速计算边方向向量
使用内联函数避免函数调用开销
典型工作流程
扩展接口设计
自定义特征支持
通过继承SurfaceFeature实现新几何类型:
class CustomFeature : public SurfaceFeature {
// 实现新特征类型的序列化/比较/变换方法
};
测量算法扩展
// 添加体积测量功能
std::optional<double> calculate_volume(const SurfaceFeature&);
注意事项
浮点精度处理:
- 所有几何比较使用EPSILON容差
- 避免直接浮点相等判断
内存管理:
- SurfaceFeature包含原始网格指针,需注意生命周期
- 使用shared_ptr管理共享数据
线程安全:
- Measuring类非线程安全
- 多线程访问需加锁或实例复制
潜在改进方向
GPU加速计算:
- 将特征提取移植到CUDA
- 使用GPU加速矩阵运算
高级几何分析:
- 曲率测量
- 质量属性计算(质心/惯性矩)
交互式测量:
- 实时测量反馈
- 动态约束系统