OpenCASCADE二维曲线求交
1 Introduction
OpenCASCADE中对二维曲线求交和三维曲线求交是不同的,三维曲线求交统一使用离散法,二维曲线求交根据曲线类型的不同分种类型进行处理。二维曲线求交中还提供了计算自交的直接接口。在TKGeomAlgo中,主要内容就是拟合、求交算法,理解求交算法的实现原理,达到能阅读和修改源码的状态,能够分析和解决实际遇到的问题,理解OpenCASCADE的能力边界,根据需要选择所需要的功能,使软件结果可控。本文主要介绍二维曲线相交的实现原理。
由于OpenCASCADE开发时间相对久远,在二维曲线求交相关代码中大量使用了宏定义的方式来实现C++ 的模板template能力,宏定义在类的XXX_0.cxx文件中,对应模板实现在*.gxx中:
这种实现方式会让代码的可读性变差,不利于代码维护。应该用C++的方式对这些*.gxx代码重构,增强代码可读性和可维护性。
2 求交分类
二维求交使用类Geom2dAPI_InterCurveCurve, 这个类是对类Geom2dInt_GInter的封装。在类Geom2dInt_GInter中,如果只输入一条曲线,可以计算自交,如果输入两条曲线,计算两条曲线的相交。
- IntCurve_IntConicConic:二次曲线与二次曲线求交。二次曲线与二次曲线求交都先使用几何方法计算交点,再判断是否在参数范围内;
- Geom2dInt_TheIntConicCurveOfGInter:二次曲线与任意曲线求交。二次曲线与任意曲线求交通过类Geom2dInt_MyImpParToolOfTheIntersectorOfTheIntConicCurveOfGInter建立距离方程,使用类math_FunctionAllRoots来对方程进行求解;
- Geom2dInt_TheIntPCurvePCurveOfGInter:任意曲线与任意曲线求交。自由曲线求交使用离散法IntCurve_IntPolyPolyGen,使用类Geom2dInt_ThePolygon2dOfTheIntPCurvePCurveOfGInter将曲线通过采样点生成多段线Polyline,使用类Intf_InterferencePolygon2d
计算多段线之间的粗交点,再使用类IntCurve_ExactIntersectionPoint
通过粗交点找到曲线上的精确交点;
这些类都是从类IntRes2d_Intersection派生:
从上图可知,二维求交结果类IntRes2d_Intersection相关派生类可知二维求交与HLR算法也有关系,理解二维曲线求交逻辑,对理解HLR代码也有帮助。
3 自交计算
当只输入一条曲线时,可以对曲线进行自交计算,主要实现逻辑为:若为普通二次曲线,则不会自交;若是其他曲线,使用离散法对曲线进行自交计算。代码如下图所示:
4 求交结果
二维曲线求交结果保存到类IntRes2d_Intersection中,主要包含两部分:
- IntRes2d_IntersectionPoint:交点数据,保存交点坐标值,交点在两个曲线上的参数,及两条曲线在交点处的过渡状态Transition;
- IntRes2d_IntersectionSegment:交线数据,当两条曲线有重叠时的几何奇异情况时,求交结果为交线;
因为类IntRes2d_Interseciton的构造函数protected,所以不能直接使用这个类,都是通过其派生类使用函数SetValues()将计算得到的交点和交线数据保存起来。这里类的设计比较繁琐,代码可读性较差。
5 Conclusion
OpenCASCADE对于二维曲线求交进行分类处理,根据曲线类型是二次曲线、参数曲线分成三类:二次曲线与二次曲线求交、二次曲线与参数曲线求交和参数曲线与参数曲线求交,不同的求交类型采用不同的策略可以提高求交性能和稳定性。使用离散法计算二维曲线自交。从求交结果来看,也处理了几何奇异问题,即曲线重叠情况。
对于曲线求交还有很大改进空间:
- 使用C++编码风格重构*.gxx代码,提高代码可读性,方便代码维护;
- 对于自由曲线求交的离散法中计算两条多段线算法中引入BVH来加速;
- 对于三维曲线求交都是使用了离散法,建议像二维曲线求交这样进行分类处理,以及引入BVH,提高性能和稳定性;
标签:求交,曲线,二次曲线,二维,OpenCASCADE,交点 From: https://www.cnblogs.com/opencascade/p/occt_int_curve2d.html