OpenCASCADE 布尔运算简介
OpenCASCADE 布尔运算简介
布尔运算(Boolean Operations)是根据两组模型的组合创建出新的模型的造型方法。两组模型Objects/Tools之间有三种布尔算子:
- 布尔并:FUSE,将两组模型合并成一个;
- 布尔减:CUT,从Objects中减去Tools模型;
- 布尔交:COMMON,即两组模型的共有部分;
布尔运算的输入是两组模型,分别叫Objects和Tools。因为两个参数的前后顺序容易混淆,借用机械加工类比来加深记忆:Objects类比为待加工的工件,Tools类比为机床刀具。当执行布尔减运算时,相当于工件Object被刀具Tool切割。
在OpenCASCADE中布尔运算第一个参数Objects也叫Arguments,第二个参数也是Tools。对应源码如下:
布尔运算的大概流程是先对两个模型进行求交计算,求交结果主要是Edge边。然后再根据求交计算新得到的Edge边进行定位分类Classification处理,排除不需要的Edge边,面等。最后根据边重构出新的BREP模型。
布尔运算的健壮性及效率依赖一些底层算法,如求交算法Intersection Algorithm,投影算法Projection Algorithm,拟合算法Approximation Algorithm及定位算法Classification Algorithm等。求交算法主要有面面求交、面边求交、边边求交等。投影和拟合算法主要用于计算边在面中的P-Curves。定位算法主要用于重构阶段,通过定位排除不需要的边、面等。
关于重构模型OpenCASCADE提供了一些算法,如通过使用函数BOPAlgo_Tools::EdgesToWires 和 BOPAlgo_Tools::WiresToFaces从线框模型生成面。
关于定位算法,提供BOPTools_AlgoTools::ComputeState计算点、边、面相对于其他模型的位置状态。提供BOPTools_AlgoTools::IsHole来判断面FACE上的环WIRE是不是孔。
通过查看源码,可以看到其实现原理:即根据环WIRE中的边EDGE的PCurve是顺时针还是逆时针来判断。通过对PCurve采样点得到一个多边形,通过计算多边形面积的正负来判断。
OpenCASCADE中关于布尔运算有详细的文档Boolean Operations Specification,若对布尔运算感兴趣,可以结合源码来看这些文档。开源的好处是可以了解算法背后的实现原理,如果有更好的方法,还可以参与贡献,让其变得更好。