# MinAreaBoundigBox 类说明
## 头文件
`MinAreaBoundingBox.hpp`
## 概述
用于计算多边形的最小面积旋转包围盒(Minimum Area Bounding Box)的工具类。支持以下功能:
- 处理凸多边形(O(n)复杂度)和简单多边形(需先计算凸包,O(n log n)复杂度)
- 支持多种几何类型输入(Polygon/ExPolygon/点集)
- 计算包围盒的旋转角度、尺寸、面积等属性
## 类定义
```cpp
class MinAreaBoundigBox {
// ... 内部实现细节
public:
enum PolygonLevel { pcConvex, pcSimple };
// 构造函数
explicit MinAreaBoundigBox(const Polygon&, PolygonLevel = pcSimple);
explicit MinAreaBoundigBox(const ExPolygon&, PolygonLevel = pcSimple);
explicit MinAreaBoundigBox(const Points&, PolygonLevel = pcSimple);
// 成员方法
double angle_to_X() const;
long double width() const;
long double height() const;
long double area() const;
const Point& axis() const;
};
成员方法详解
构造函数
方法签名 | 说明 |
---|
explicit MinAreaBoundigBox(const Polygon&, PolygonLevel = pcSimple) | 通过Polygon对象构造 |
explicit MinAreaBoundigBox(const ExPolygon&, PolygonLevel = pcSimple) | 通过ExPolygon对象构造 |
explicit MinAreaBoundigBox(const Points&, PolygonLevel = pcSimple) | 通过点集直接构造 |
参数说明:
- 第二个参数
PolygonLevel
:
pcConvex
: 已知输入为凸多边形,跳过凸包计算pcSimple
(默认): 输入为任意简单多边形,自动计算凸包
属性获取方法
方法 | 返回值 | 说明 |
---|
angle_to_X() | double | 返回包围盒与X轴对齐所需旋转角度(弧度) |
width() | long double | 包围盒宽度(旋转后的X轴方向) |
height() | long double | 包围盒高度(旋转后的Y轴方向) |
area() | long double | 包围盒面积(width * height) |
axis() | const Point& | 返回包围盒旋转轴的方向向量(未标准化) |
辅助函数
void remove_collinear_points(Polygon& p);
void remove_collinear_points(ExPolygon& p);
使用示例
Slic3r::Polygon poly = ...;
MinAreaBoundigBox mabb(poly);
double angle = mabb.angle_to_X();
long double w = mabb.width();
long double h = mabb.height();
std::cout << "需要旋转角度:" << angle * 180 / M_PI << "度\n"
<< "包围盒尺寸:" << w << " x " << h << "\n"
<< "面积:" << mabb.area();
算法特性
- 凸多边形优化:对于已知的凸多边形,直接使用旋转卡尺法(Rotating Calipers)实现O(n)时间复杂度
- 自动凸包处理:对于非凸多边形,自动计算凸包(O(n log n)时间复杂度)
- 高精度计算:使用
long double
类型保证计算精度 - 几何预处理:提供
remove_collinear_points
函数优化输入数据
应用场景
- 3D打印中的模型自动旋转排样
- CAD软件的自动对齐功能
- 计算机视觉中的物体方向检测
- 机器人路径规划中的包围盒计算