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:23 eryar 阅读(278) 评论(0)  编辑 收藏 引用 所属分类: 2.OpenCASCADE

OpenCASCADE 线面求交

eryar@163.com

1 Introduction

OpenCASCADE中几何曲线与曲面求交使用类GeomAPI_IntCS,是对类IntCurveSurface_HInter的简单封装。在IntCurveSurface_HInter中对曲线和曲面求交分为以下几种类型:

  • PerformConicSurf:二次曲线与曲面求交,其中又分为两类:二次曲线与二次曲面求交和二次曲线和自由曲面求交;
  • InternalPerformCurveQuadric:自由曲线与二次曲面求交;
  • InternalPerform:自由曲线和自由曲面求交;

本文主要介绍曲线与曲面求交的实现原理。

2 二次曲线与二次曲面求交

二次曲线与二次曲面求交使用IntAna_ConicQuad计算,主要思路是将曲线用参数方程表示,代入二次曲面的代数方程。二次曲面可以使用二次多项式表示,将二次曲线与二次曲面相交表示成一个多项式方程,使用math_DirectPolynomialRoots对多项式方程进行求解。

3 二次曲线与自由曲面求交

二次曲线与自由曲面求交将曲面使用IntCurveSurface_Polyhedron在U,V上采样离散得到grid网格。这个类实现与IntPolyh_MaillageAffinage类功能有重复。

IntCurveSurface_ThePolygon多段线与Intf_InterferencePolygonPolyhedron 网格求交,根据多段线与网格求交情况,找到初始值,使用IntImp_IntCS计算精确值。与曲面求交的Marching算法类似,使用迭代法去计算精确交点。迭代方程为IntImp_ZerCSParFunc,写出这个方程的Value()值计算和Derivatives()微分计算公式。

将曲线与曲面求交问题转化为求曲面参数u,v和曲线参数w,使曲线C(w)曲面S(u,v)上的点重合,建立函数如下:

F(u,v,w)=S(u,v) - C(w)

所求的精确交点满足方程F(u,v,w)=0,F为一含有三个坐标的矢量,对应函数Value():

Fx(u,v,w)=Sx(u,v) - Cx(w) = 0

Fy(u,v,w)=Sy(u,v) - Cy(w) = 0

Fz(u,v,w)=Sz(u,v) - Cz(w) = 0

上面为含有三个方程的以u,v,w为变量的非线性方程组,精确交点就是非线性方程组的解。使用类math_FunctionSetRoot应用Newton-Raphson迭代法求解非线性方程组的解。使用Newton迭代法有个前提条件是要求非线性方程组一阶可导,即要写出Jacobian迭代矩阵,即上述函数Derivatives()的实现原理:

4 自由曲线与二次曲面求交

自由曲线与二次曲面求交IntCurveSurface_TheQuadCurvExactInter ,通过类IntCurveSurface_TheQuadCurvFuncOfTheQuadCurvExactHInter建立二次曲面与曲线之间的函数,是求解曲线上参数U的一元函数。

5 自由曲线与自由曲面求交

自由曲线与自由曲面求交和二维自由曲线求交类似,采用的离散法。即将曲线通过采样离散成多段线Polygon,将曲面采样生成网格Polyhedron,通过类IntCurveSurface_TheInterferenceOfHInter来计算多段线与网格的相交。

包Intf主要用来计算二维多段线、三维多段线及网格的相交。根据离散计算的粗交点,再根据类IntCurveSurface_TheExactHInter使用迭代法求得精确交点。这个思想与曲面和曲面求交相同。

6 求交结果

曲线与曲面求交的结果主要也是保存在类IntCurveSurface_Intersection对象中,这个类的设计与二维曲线求交类似,不够直接。

可以看到IntCurveSurface_Intersection这个类的构造函数是protected的,意思是不能直接使用,通过派生类IntCurveSurface_HInter调用SetValues()函数将求交结果保存起来。求交结果为交点IntCurveSurface_IntersectionPoint和交线IntCurveSurface_IntersectionSegment。

其中交点中IntCurveSurface_IntersectionPoint保存了三维坐标点,交点在曲面上的U,V参数,交点在曲线上的参数U及相交状态。交线主要是线现面和重合部分的几何奇异情况数据。

从类图上可以看出,这个套路同样用到了HLR算法中,理解这个套路对理解HLR算法有帮助。

7 Conclusion

综上所述,OpenCASCADE中将曲线与曲面求交根据曲线和曲面类型的不同分别处理。二次曲线曲面求交依赖IntAna包,自由曲线和自由曲面求交使用离散法,最终实现算法与两个曲面求交的Marching算法类似,通过离散得到的精交点,再代入迭代方程求得精确解。其中把曲线或曲面离散的采样点没有考虑曲线或曲面的曲率等,采样点数量较大,会影响性能 。曲面采样离散代码与曲面求交中的有重复。从几何求交类中可以看到没有容差的输入,可以思考一下这个问题。

TKGeomAlgo中除了拟合算法外,大部分代码主要就是线线求交、线面求交及面面求交算法。理解这些算法的实现原理,为Boolean算法的求交逻辑打下基础。

 


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