BambuStudio学习笔记:Point

# 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字节)

应用场景示例

模型切片处理

读取STL模型
三角面片处理
分层切片
生成轮廓点集
路径优化处理
写入G-code

支撑结构生成

// 在指定半径内查找最近支撑点
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();
    }
};
}

注意事项

  1. 坐标溢出

    • 大尺寸模型需使用64位coord_t
    • 关键运算使用int128精确计算
  2. 浮点精度

    • 几何比较使用epsilon判断
    • 避免累积误差:is_approx(v1, v2, 1e-6)
  3. 线程安全

    • ClosestPointInRadiusLookup非线程安全
    • 变换矩阵操作需加锁保护

该模块通过精心设计的类型系统和高效的算法实现,为3D打印软件提供了可靠的几何处理基础,兼顾性能与精度要求,支持从模型处理到路径生成的全流程计算需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值