2026-07-23 05:27:51 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
|
#include "vde/mesh/halfedge_mesh.h"
|
|
|
|
|
|
|
|
|
|
|
|
namespace vde::mesh {
|
2026-07-23 08:19:24 +00:00
|
|
|
|
using core::Point2D;
|
|
|
|
|
|
using core::Point3D;
|
|
|
|
|
|
using core::Vector3D;
|
2026-07-23 05:27:51 +00:00
|
|
|
|
|
2026-07-24 11:04:04 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief 布尔运算类型(CSG 组合)
|
|
|
|
|
|
* @ingroup mesh
|
|
|
|
|
|
*/
|
|
|
|
|
|
enum class BooleanOp {
|
|
|
|
|
|
Union, ///< A ∪ B 并集
|
|
|
|
|
|
Intersection, ///< A ∩ B 交集
|
|
|
|
|
|
Difference, ///< A \ B 差集
|
|
|
|
|
|
SymDiff ///< A Δ B 对称差集
|
|
|
|
|
|
};
|
2026-07-23 05:27:51 +00:00
|
|
|
|
|
2026-07-24 11:04:04 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief 三角网格布尔运算
|
|
|
|
|
|
*
|
|
|
|
|
|
* 对两个封闭三角网格执行 CSG(Constructive Solid Geometry)布尔操作。
|
|
|
|
|
|
* 内部流程:
|
|
|
|
|
|
* 1. 计算两个网格的三角形-三角形交线
|
|
|
|
|
|
* 2. 沿交线细分三角形(conforming 三角化)
|
|
|
|
|
|
* 3. 根据布尔类型对每个子面片做内/外分类
|
|
|
|
|
|
* 4. 缝合属于结果的部分形成新网格
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param a 第一个三角网格(必须为封闭流形)
|
|
|
|
|
|
* @param b 第二个三角网格(必须为封闭流形)
|
|
|
|
|
|
* @param op 布尔运算类型
|
|
|
|
|
|
* @return 结果三角网格
|
|
|
|
|
|
*
|
|
|
|
|
|
* @note 要求输入网格为封闭流形(watertight),否则分类不可靠
|
|
|
|
|
|
* @code{.cpp}
|
|
|
|
|
|
* auto result = mesh_boolean(cube, sphere, BooleanOp::Difference);
|
|
|
|
|
|
* // result = 立方体减去球体的交集部分
|
|
|
|
|
|
* @endcode
|
|
|
|
|
|
* @ingroup mesh
|
|
|
|
|
|
*/
|
2026-07-23 05:27:51 +00:00
|
|
|
|
HalfedgeMesh mesh_boolean(const HalfedgeMesh& a, const HalfedgeMesh& b, BooleanOp op);
|
|
|
|
|
|
|
|
|
|
|
|
} // namespace vde::mesh
|