OpenCASCADE中对二维曲线求交和三维曲线求交是不同的,三维曲线求交统一使用离散法,二维曲线求交根据曲线类型的不同分种类型进行处理。二维曲线求交中还提供了计算自交的直接接口。在TKGeomAlgo中,主要内容就是拟合、求交算法,理解求交算法的实现原理,达到能阅读和修改源码的状态,能够分析和解决实际遇到的问题,理解OpenCASCADE的能力边界,根据需要选择所需要的功能,使软件结果可控。本文主要介绍二维曲线相交的实现原理。
由于OpenCASCADE开发时间相对久远,在二维曲线求交相关代码中大量使用了宏定义的方式来实现C++ 的模板template能力,宏定义在类的XXX_0.cxx文件中,对应模板实现在*.gxx中:
这种实现方式会让代码的可读性变差,不利于代码维护。应该用C++的方式对这些*.gxx代码重构,增强代码可读性和可维护性。
二维求交使用类Geom2dAPI_InterCurveCurve, 这个类是对类Geom2dInt_GInter的封装。在类Geom2dInt_GInter中,如果只输入一条曲线,可以计算自交,如果输入两条曲线,计算两条曲线的相交。
这些类都是从类IntRes2d_Intersection派生:
从上图可知,二维求交结果类IntRes2d_Intersection相关派生类可知二维求交与HLR算法也有关系,理解二维曲线求交逻辑,对理解HLR代码也有帮助。
当只输入一条曲线时,可以对曲线进行自交计算,主要实现逻辑为:若为普通二次曲线,则不会自交;若是其他曲线,使用离散法对曲线进行自交计算。代码如下图所示:
二维曲线求交结果保存到类IntRes2d_Intersection中,主要包含两部分:
因为类IntRes2d_Interseciton的构造函数protected,所以不能直接使用这个类,都是通过其派生类使用函数SetValues()将计算得到的交点和交线数据保存起来。这里类的设计比较繁琐,代码可读性较差。
OpenCASCADE对于二维曲线求交进行分类处理,根据曲线类型是二次曲线、参数曲线分成三类:二次曲线与二次曲线求交、二次曲线与参数曲线求交和参数曲线与参数曲线求交,不同的求交类型采用不同的策略可以提高求交性能和稳定性。使用离散法计算二维曲线自交。从求交结果来看,也处理了几何奇异问题,即曲线重叠情况。
对于曲线求交还有很大改进空间: