2026-07-24 11:02:06 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @file boolean_2d.h
|
|
|
|
|
|
* @brief 二维多边形布尔运算
|
|
|
|
|
|
*
|
|
|
|
|
|
* 支持并集、交集、差集、对称差等标准布尔操作。
|
|
|
|
|
|
* 基于 Vatti 算法实现。
|
|
|
|
|
|
*
|
|
|
|
|
|
* @ingroup boolean
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
2026-07-23 05:27:51 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
|
#include "vde/core/polygon.h"
|
|
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
|
|
|
|
namespace vde::boolean {
|
2026-07-23 08:19:24 +00:00
|
|
|
|
using core::Point2D;
|
|
|
|
|
|
using core::Polygon2D;
|
2026-07-23 05:27:51 +00:00
|
|
|
|
|
2026-07-24 11:02:06 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief 布尔运算类型
|
|
|
|
|
|
*/
|
|
|
|
|
|
enum class BooleanOp {
|
|
|
|
|
|
Union, /**< 并集 A ∪ B */
|
|
|
|
|
|
Intersection, /**< 交集 A ∩ B */
|
|
|
|
|
|
Difference, /**< 差集 A − B */
|
|
|
|
|
|
SymDiff /**< 对称差 (A − B) ∪ (B − A) */
|
|
|
|
|
|
};
|
2026-07-23 05:27:51 +00:00
|
|
|
|
|
2026-07-24 11:02:06 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief 二维多边形布尔运算
|
|
|
|
|
|
*
|
|
|
|
|
|
* 对两个简单多边形执行指定布尔操作。
|
|
|
|
|
|
* 当前实现:基于 Vatti 算法的边行走方式处理凸多边形,
|
|
|
|
|
|
* 可扩展支持任意简单多边形(含孔洞)。
|
|
|
|
|
|
*
|
|
|
|
|
|
* 算法流程:
|
|
|
|
|
|
* 1. 找到两条多边形的所有交点
|
|
|
|
|
|
* 2. 跟踪边界根据布尔操作选择进入/退出边
|
|
|
|
|
|
* 3. 组装结果多边形
|
|
|
|
|
|
*
|
|
|
|
|
|
* @note 当前版本优化了凸多边形路径。对于带孔洞或自交的
|
|
|
|
|
|
* 复杂多边形,建议先三角剖分或使用 mesh_boolean。
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param a 第一个多边形
|
|
|
|
|
|
* @param b 第二个多边形
|
|
|
|
|
|
* @param op 布尔操作类型
|
|
|
|
|
|
* @return 结果多边形列表(可能有多个分离的组件)
|
|
|
|
|
|
*
|
|
|
|
|
|
* @code{.cpp}
|
|
|
|
|
|
* Polygon2D p1 = make_circle(10, Point2D{0,0}, 5.0);
|
|
|
|
|
|
* Polygon2D p2 = make_circle(10, Point2D{3,0}, 5.0);
|
|
|
|
|
|
* auto result = boolean_2d(p1, p2, BooleanOp::Union);
|
|
|
|
|
|
* @endcode
|
|
|
|
|
|
*
|
|
|
|
|
|
* @see BooleanOp, mesh_boolean, polygon_offset
|
|
|
|
|
|
*/
|
2026-07-23 05:27:51 +00:00
|
|
|
|
std::vector<Polygon2D> boolean_2d(const Polygon2D& a, const Polygon2D& b, BooleanOp op);
|
|
|
|
|
|
|
|
|
|
|
|
} // namespace vde::boolean
|