eryar

PipeCAD - Plant Piping Design Software.
RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
posts - 603, comments - 590, trackbacks - 0, articles - 0

OpenCASCADE二维曲线求交

Posted on 2023-12-02 12:22 eryar 阅读(970) 评论(0)  编辑 收藏 引用 所属分类: 2.OpenCASCADE

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,提高性能和稳定性;

 


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理