BambuStudio学习笔记:Geometry类
# Geometry.hpp 模块解析
## 概述
`Geometry.hpp` 是 Slic3r 的核心几何处理模块,提供基础的几何计算、坐标变换及多边形处理功能,支撑3D打印中的模型布局、路径规划及碰撞检测等关键操作。
## 核心功能
### 1. 几何关系判定
- **方向检测**
`orient()` 计算三点排列方向(CCW/CW/共线),基于精确叉积运算,确保路径顶点顺序正确性。
```cpp
Orientation orient(const Point &a, const Point &b, const Point &c);
- 多边形方向
is_ccw()
判定多边形顶点是否逆时针排列,用于修复模型孔洞方向。bool is_ccw(const Polygon &poly);
2. 线段相交计算
- 射线与线段相交
精确计算射线/线段交点,支撑路径避让逻辑。bool ray_ray_intersection(...); bool segment_segment_intersection(...);
3. 坐标变换系统
- 变换组合
assemble_transform()
组合平移、旋转、缩放、镜像生成变换矩阵,支持多层次模型布局。Transform3d assemble_transform(const Vec3d& translation, ...);
- 变换分解
Transformation
类封装变换参数,支持动态矩阵生成与组合运算。class Transformation { Vec3d m_offset, m_rotation, m_scaling_factor, m_mirror; // 矩阵生成与操作 Transform3d get_matrix(...) const; };
4. 奇异值分解 (SVD)
- 变换成分分析
TransformationSVD
分解变换矩阵为旋转、缩放、镜像成分,检测各向异性变形。struct TransformationSVD { Matrix3d u, s, v; // 旋转、缩放、镜像成分 };
5. 实用算法
- 线段裁剪
Liang-Barsky算法裁剪线段至边界框,优化打印头移动路径。bool liang_barsky_line_clipping(...);
- 多边形简化
simplify_polygons()
减少顶点数量,提升计算效率。void simplify_polygons(const Polygons &polygons, double tolerance, ...);
关键应用场景
模型布局优化
- 自动排列算法
arrange()
函数基于边界框检测,自动排布多个模型,避免打印床碰撞。bool arrange(size_t num_parts, const Vec2d &part_size, ...);
支撑结构生成
- 线段相交检测
segments_intersect()
判断支撑与模型交叠,确保支撑结构有效性。
动态路径调整
- 实时坐标变换
Transformation
类实现动态模型旋转/缩放,适应打印过程中的实时调整需求。
性能优化
- 矩阵缓存机制
Transformation
类缓存变换矩阵,避免重复计算,提升布局计算效率。 - 精确整数运算
方向检测使用64位整数运算,消除浮点误差,确保几何逻辑正确性。
扩展接口
- 文件格式解析
transform3d_from_string()
解析3MF/AMF文件中的变换数据,兼容多格式导入。Transform3d transform3d_from_string(const std::string& transform_str);
模块依赖
• Eigen库
提供矩阵运算支持,实现高效坐标变换计算。
• ClipperLib
多边形布尔运算基础,支撑复杂几何操作。
该模块通过高效算法与精确计算,确保Slic3r在模型处理、路径优化等核心环节的可靠性与性能。