ViewDesignEngine  3.1.0
高性能 CAD 计算几何引擎
vde::boolean 命名空间参考

枚举

enum class  BooleanOp { Union , Intersection , Difference , SymDiff }
 布尔运算类型 更多...
 

函数

std::vector< Polygon2Dboolean_2d (const Polygon2D &a, const Polygon2D &b, BooleanOp op)
 二维多边形布尔运算 更多...
 
HalfedgeMesh mesh_union (const HalfedgeMesh &a, const HalfedgeMesh &b)
 网格并集 A ∪ B 更多...
 
HalfedgeMesh mesh_intersection (const HalfedgeMesh &a, const HalfedgeMesh &b)
 网格交集 A ∩ B 更多...
 
HalfedgeMesh mesh_difference (const HalfedgeMesh &a, const HalfedgeMesh &b)
 网格差集 A − B 更多...
 
HalfedgeMesh mesh_sym_diff (const HalfedgeMesh &a, const HalfedgeMesh &b)
 网格对称差 (A − B) ∪ (B − A) 更多...
 
HalfedgeMesh clip_mesh (const HalfedgeMesh &a, const HalfedgeMesh &b, bool invert_b=false)
 用网格 B 裁剪网格 A 更多...
 
HalfedgeMesh invert_mesh (const HalfedgeMesh &m)
 翻转网格所有面片的法线方向 更多...
 
HalfedgeMesh merge_meshes (const HalfedgeMesh &a, const HalfedgeMesh &b)
 合并两个网格 更多...
 
HalfedgeMesh mesh_boolean (const HalfedgeMesh &a, const HalfedgeMesh &b, BooleanOp op)
 网格布尔运算统一接口 更多...
 
bool is_point_inside_mesh (const core::Point3D &p, const HalfedgeMesh &mesh)
 判断三维点是否在封闭网格内部 更多...
 
std::vector< Polygon2Dpolygon_offset (const Polygon2D &poly, double distance)
 多边形等距偏移 更多...
 

枚举类型说明

◆ BooleanOp

布尔运算类型

枚举值
Union 

并集 A ∪ B

Intersection 

交集 A ∩ B

Difference 

差集 A − B

SymDiff 

对称差 (A − B) ∪ (B − A)

在文件 boolean_2d.h22 行定义.

函数说明

◆ boolean_2d()

std::vector<Polygon2D> vde::boolean::boolean_2d ( const Polygon2D a,
const Polygon2D b,
BooleanOp  op 
)

二维多边形布尔运算

对两个简单多边形执行指定布尔操作。 当前实现:基于 Vatti 算法的边行走方式处理凸多边形, 可扩展支持任意简单多边形(含孔洞)。

算法流程:

  1. 找到两条多边形的所有交点
  2. 跟踪边界根据布尔操作选择进入/退出边
  3. 组装结果多边形
注解
当前版本优化了凸多边形路径。对于带孔洞或自交的 复杂多边形,建议先三角剖分或使用 mesh_boolean。
参数
a第一个多边形
b第二个多边形
op布尔操作类型
返回
结果多边形列表(可能有多个分离的组件)
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);
std::vector< Polygon2D > boolean_2d(const Polygon2D &a, const Polygon2D &b, BooleanOp op)
二维多边形布尔运算
foundation::Point2D Point2D
双精度二维点(重新导出)
Definition: point.h:29
参见
BooleanOp, mesh_boolean, polygon_offset

◆ clip_mesh()

HalfedgeMesh vde::boolean::clip_mesh ( const HalfedgeMesh a,
const HalfedgeMesh b,
bool  invert_b = false 
)

用网格 B 裁剪网格 A

保留网格 A 中位于 B 体外的面片。 是 mesh_difference 的简化变体,仅输出来自 A 的面片。

参数
a待裁剪网格
b裁剪体网格
invert_b若为 true,将 B 的内外判定取反(裁剪外部)
返回
裁剪后的网格(仅包含 A 的面片)
// 裁剪 cube 外部的 sphere 面片
auto clipped = clip_mesh(sphere, cube, false // invert_b);
// 保留 cube 内部的 sphere 面片
auto inner = clip_mesh(sphere, cube, true // invert_b);
HalfedgeMesh clip_mesh(const HalfedgeMesh &a, const HalfedgeMesh &b, bool invert_b=false)
用网格 B 裁剪网格 A
double sphere(const Point3D &p, double radius)
球体的 SDF
参见
mesh_difference, is_point_inside_mesh

◆ invert_mesh()

HalfedgeMesh vde::boolean::invert_mesh ( const HalfedgeMesh m)

翻转网格所有面片的法线方向

遍历所有面片,反转其顶点环绕顺序。 常用于生成负体积(反向外壳)或差集操作中。

参数
m原始网格
返回
法线翻转后的网格
参见
mesh_difference

◆ is_point_inside_mesh()

bool vde::boolean::is_point_inside_mesh ( const core::Point3D p,
const HalfedgeMesh mesh 
)

判断三维点是否在封闭网格内部

使用射线投射法:从点 p 向任意方向射出射线, 统计与网格面片的交点数量。 奇数表示在内部,偶数表示在外部。

算法:

  1. 构造从 p 出发沿 +x 方向的射线
  2. 遍历所有三角形进行射线-三角形求交
  3. 统计交点数量
  4. 返回奇偶性判定结果
参数
p待判定点
mesh封闭网格
返回
点在网格内部返回 true
注解
网格必须是封闭(水密)的,否则结果不可靠。 点恰好落在面上时行为未定义。
参见
clip_mesh, mesh_difference

◆ merge_meshes()

HalfedgeMesh vde::boolean::merge_meshes ( const HalfedgeMesh a,
const HalfedgeMesh b 
)

合并两个网格

将两个网格的顶点和面片直接拼接,不做布尔操作。 用于将分离的网格组件合并到单个数据结构中。

参数
a网格 A
b网格 B
返回
包含 A 和 B 全部顶点和面片的合并网格
注解
不处理重叠区域;仅做纯几何拼接
参见
mesh_union(做布尔合并)

◆ mesh_boolean()

HalfedgeMesh vde::boolean::mesh_boolean ( const HalfedgeMesh a,
const HalfedgeMesh b,
BooleanOp  op 
)

网格布尔运算统一接口

根据布尔操作类型分发到对应的具体函数。

参数
a网格 A
b网格 B
op布尔操作类型
返回
结果网格
HalfedgeMesh mesh_boolean(const HalfedgeMesh &a, const HalfedgeMesh &b, BooleanOp op)
网格布尔运算统一接口
参见
BooleanOp, mesh_union, mesh_intersection, mesh_difference, mesh_sym_diff

◆ mesh_difference()

HalfedgeMesh vde::boolean::mesh_difference ( const HalfedgeMesh a,
const HalfedgeMesh b 
)

网格差集 A − B

保留网格 A 中重心在网格 B 外的面片, 以及网格 B 中重心在网格 A 内的面片(翻转法线)。

参数
a网格 A
b网格 B
返回
A − B 的差集网格
注解
结果中来自 B 的面片会被翻转法线以保持内-外一致性
参见
mesh_union, mesh_intersection, mesh_sym_diff

◆ mesh_intersection()

HalfedgeMesh vde::boolean::mesh_intersection ( const HalfedgeMesh a,
const HalfedgeMesh b 
)

网格交集 A ∩ B

保留网格 A 中重心在网格 B 内的面片, 以及网格 B 中重心在网格 A 内的面片。

参数
a网格 A
b网格 B
返回
A ∩ B 的交集网格
注解
结果体积为两网格公共区域
参见
mesh_union, mesh_difference

◆ mesh_sym_diff()

HalfedgeMesh vde::boolean::mesh_sym_diff ( const HalfedgeMesh a,
const HalfedgeMesh b 
)

网格对称差 (A − B) ∪ (B − A)

等价于:

HalfedgeMesh mesh_union(const HalfedgeMesh &a, const HalfedgeMesh &b)
网格并集 A ∪ B
HalfedgeMesh mesh_difference(const HalfedgeMesh &a, const HalfedgeMesh &b)
网格差集 A − B
参数
a网格 A
b网格 B
返回
对称差网格
参见
mesh_difference, mesh_union

◆ mesh_union()

HalfedgeMesh vde::boolean::mesh_union ( const HalfedgeMesh a,
const HalfedgeMesh b 
)

网格并集 A ∪ B

保留网格 A 中重心在网格 B 外的面片, 以及网格 B 中重心在网格 A 外的面片。 合并后形成两个网格的并集体积。

原理:对每个面片计算重心坐标,用射线投射判断 该点是否在对方网格内部,据此决定保留或剔除。

参数
a网格 A
b网格 B
返回
A ∪ B 的合并网格
HalfedgeMesh result = mesh_union(cube, sphere);
参见
mesh_intersection, mesh_difference, is_point_inside_mesh

◆ polygon_offset()

std::vector<Polygon2D> vde::boolean::polygon_offset ( const Polygon2D poly,
double  distance 
)

多边形等距偏移

将多边形的每条边沿其法线方向平移指定距离, 在转角处自动生成圆弧/斜角连接。

算法:

  1. 对每条边计算单位外法线
  2. 沿法线平移 distance 距离
  3. 相邻偏移边求交形成新的顶点
  4. 检测自交并移除退化区域
  • 正距离 = 外扩(膨胀/Inflation)
  • 负距离 = 内缩(偏置/Deflation)
参数
poly原始多边形
distance偏移距离(正=外扩,负=内缩)
返回
偏移后的多边形列表(内缩或自交可能产生多个碎片)
注解
使用直骨架近似而非精确圆弧偏移,转角处为斜角连接。 大距离负偏移可能导致多边形完全消失(返回空列表)。
Polygon2D rect = {{0,0}, {10,0}, {10,5}, {0,5}};
// 外扩 2 单位
auto inflated = polygon_offset(rect, 2.0);
// 内缩 1 单位(生成工具路径)
auto toolpath = polygon_offset(rect, -1.0);
std::vector< Polygon2D > polygon_offset(const Polygon2D &poly, double distance)
多边形等距偏移
参见
boolean_2d