# Point.hpp 几何处理模块解析
## 模块概述
本模块为3D打印切片软件提供核心几何处理功能,涵盖点、向量、矩阵操作及空间查询等,基于Eigen库实现高效数学运算,支持高精度坐标处理与复杂几何变换。
## 核心数据结构
### 1. 基础向量类型
```cpp
using Vec2crd = Eigen::Matrix<coord_t, 2, 1>; // 二维整数坐标
using Vec3d = Eigen::Matrix<double, 3, 1>; // 三维双精度向量
- 坐标体系:
coord_t
:系统基础坐标类型(通常为int32/int64)- 提供2D/3D整数及浮点向量类型
2. 点集合类型
using Points = std::vector<Point>; // 二维整数点集
using Pointfs = std::vector<Vec2d>; // 二维浮点坐标点集
using VecOfPoints = std::vector<Points>; // 多层点集结构
3. 矩阵变换
using Matrix3d = Eigen::Matrix<double, 3, 3>; // 3x3双精度矩阵
using Transform3d = Eigen::Affine3d; // 三维仿射变换
关键功能实现
1. 几何运算
向量操作:
// 二维叉积计算
template<typename T>
T cross2(const Eigen::MatrixBase<T>& v1, const Eigen::MatrixBase<T>& v2) {
return v1.x()*v2.y() - v1.y()*v2.x();
}
// 垂直向量生成
Vec2d perp(const Vec2d& v) { return {-v.y(), v.x()}; }
角度计算:
double angle(const Vec2d& v1, const Vec2d& v2) {
return atan2(cross2(v1, v2), v1.dot(v2));
}
2. 点类功能
坐标变换:
void Point::rotate(double angle, const Point& center) {
Vec2d offset = (*this - center).cast<double>();
double cos_a = cos(angle);
double sin_a = sin(angle);
*this = center + (Vec2d(cos_a*offset.x() - sin_a*offset.y(),
sin_a*offset.x() + cos_a*offset.y())).cast<coord_t>();
}
邻近查询:
int Point::nearest_point_index(const Points& points) const {
int index = -1;
double min_dist = INFINITY;
for (size_t i=0; i<points.size(); ++i) {
double d = (points[i] - *this).squaredNorm();
if (d < min_dist) {
min_dist = d;
index = i;
}
}
return index;
}
3. 空间索引优化
最近点查询结构:
template<typename ValueType>
class ClosestPointInRadiusLookup {
public:
void insert(const ValueType& value) {
// 空间哈希分桶存储
m_map.emplace(hash(point), value);
}
std::pair<ValueType*, double> find(const Point& pt) {
// 查询相邻网格单元中的最近点
}
};
坐标系统转换
精度转换函数
// 物理坐标转逻辑坐标
template<typename T>
Vec2crd scaled(const T& v) {
return (v / SCALING_FACTOR).cast<coord_t>();
}
// 逻辑坐标转物理坐标
template<typename T>
Vec2d unscaled(const T& v) {
return v.cast<double>() * SCALING_FACTOR;
}
网格对齐
coord_t align_to_grid(coord_t coord, coord_t spacing) {
return (coord / spacing) * spacing; // 向下对齐
}
Point align_to_grid(Point coord, Point spacing) {
return {align_to_grid(coord.x(), spacing.x()),
align_to_grid(coord.y(), spacing.y())};
}
性能优化策略
1. SIMD向量化
- 利用Eigen库的向量指令优化矩阵运算
- 自动启用SSE/AVX指令加速浮点运算
2. 空间哈希索引
- 将二维空间划分为网格单元(2*搜索半径)
- 邻近查询仅需检查相邻9个网格单元
3. 内存布局优化
- 使用Eigen的DontAlign选项避免内存对齐浪费
- 小尺寸向量直接栈分配(≤16字节)
应用场景示例
模型切片处理
支撑结构生成
// 在指定半径内查找最近支撑点
ClosestPointInRadiusLookup<SupportPoint> support_points(0.2);
support_points.insert(all_supports);
auto [nearest, dist] = support_points.find(current_point);
if (dist < 0.1*0.1) {
merge_support_points(current, nearest);
}
扩展功能接口
序列化支持
// Cereal库序列化适配
template<class Archive>
void serialize(Archive& ar, Vec3d& v) {
ar(v.x(), v.y(), v.z());
}
Boost.Polygon集成
namespace boost::polygon {
template<>
struct point_traits<Point> {
static coord_t get(const Point& p, orientation_2d orient) {
return orient == HORIZONTAL ? p.x() : p.y();
}
};
}
注意事项
-
坐标溢出:
- 大尺寸模型需使用64位coord_t
- 关键运算使用int128精确计算
-
浮点精度:
- 几何比较使用epsilon判断
- 避免累积误差:is_approx(v1, v2, 1e-6)
-
线程安全:
- ClosestPointInRadiusLookup非线程安全
- 变换矩阵操作需加锁保护
该模块通过精心设计的类型系统和高效的算法实现,为3D打印软件提供了可靠的几何处理基础,兼顾性能与精度要求,支持从模型处理到路径生成的全流程计算需求。