提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
出于对布尔算法的好奇,去了解了下OpenCascade的布尔算法,对于其中隶属关系的处理(Classify)记录下。
一、点在实体内外关系的判定
在《几何造型学》(中译版)一书中有相关介绍(链接:https://pan.baidu.com/s/1QqMaHACbues7N7ASpgw45Q
提取码:1234)主要是利用实体中最近点的法向量判断定,当然会遇到很多特殊情况,比如点在边界上。
俄文版的《Geometric Modeling》(同名书籍很多,作者不同)中介绍的布尔运算也有提到法线。
但边界经典的《Boundary Representation Modelling Techniques》好像未提到,里面有欧拉算子的详细介绍。
二、布尔运算中的隶属关系判定
在一些文献和书籍中有关于布尔运算的介绍。布尔运算基本有两个过程,第一个过程是曲面求交,这方面的文章比较多,主要是多种方法结合(三角/网格化提供初值,最后用迭代、追踪法精确求解);第二个过程主要是隶属关系判定和结果重建。重建的方法可以使用欧拉算子(以Parasolid内核为代表),也可以不用使用欧拉算子(OpenCascade等内核)。其中隶属关系的判断就会用到上面的点在实体内外关系的判定(opencascade采用的是上面的法线法),为了完备性,特殊情况时可能会有很多夹角检测。
在OpenCascade中,布尔实现时,会建立很多映射表(image)(哈希表Map),最后一步构造实体时,都会涉及隶属关系的判断。
其中包含了很多特殊情况,暂时先不去考虑,最近点对应的射线在这句iFlag = SolidExplorer.OtherSegment(P,L,Par);
(对应BRepClass3d_SolidExplorer类中的函数)
比较骚操作的是点在实体内外关系的判定这里,这句"return 3; // skv - the point is on surface but outside face.“(求得的最近点在几何面上,但不在裁剪的拓扑面上),和前面求点到拓扑面最小距离是时的问题一样。回到上层的BRepClass3d_SClassifier执行函数中,这句”
// Check if the point is ON surface but OUT of the face.
// Just skip this face because it is bad for classification.
if (iFlag == 3)
continue;"
隶属关系的实现原理中使用了最近点的方法,但它并未去求裁剪曲面的精确最近点(裁剪边界约束下),当遇到极限情况时:一个实体全由裁剪曲面构成,存在一要判定关系的点,但对每个面求得的最近点都在几何面上却不在拓扑面上时,上述函数直接错过了判定。所以,这是设计缺陷(occ的布尔可靠性比较差)?还是在其他不起眼的地方处理了?