OpenCASCADE曲线上点的反求
1 Introduction
曲线可以用代数方程表示,如圆可以用X^2+Y^2=R^2表示,也可以用参数方程X(u)=RCos(u), Y(u)=RSin(u)表示。要判断点是不是在线上,用曲线代数方程可以很直接得出结果,但是使用参数方程就没有那么直接。这也是参数曲线上点的反求问题,参数曲线上点的反求问题应用广泛,如前面所述判断点是否在曲线上、点向曲线投影、点与线的求交、点在参数曲线上的参数等,都与点的反求问题相关。本文主要结合代码介绍OpenCASCADE曲线上点的反求实现原理及使用过程中的一些注意事项。
2 实现原理
在《The NURBS Book》书中将点的反求问题归结为点向曲线投影距离最短的问题,如下图所示:
建立函数f(u)=C’(u).(C(u) - P)表示点到曲线距离,当f(u)=0时为点到曲线的最短距离,不管点P是否在曲线上。几何意义是点到曲线任意点的向量与任意点处的切向量点积为零,表示在两个向量垂直的时候求得极值点。注意数学方程中垂直这个几何意义。
OpenCASCADE中实现曲线上点的反求原理与《The NURBS Book》书中一致。点的反求使用类GeomLib_Tool::Parameter()函数:
输入曲线、点和最大距离,计算点是否在曲线上及若在曲线上,点对应参数曲线的参数U。
类Extrema_ExtPC计算点P到线C的极值Extrema。根据代码注释可以看出点的反求数学方程与《The NURBS Book》书中一致:
数学方程对应的类的变量为myF,类名为Extrema_FuncExtPC,从类math_FunctionWithDerivative派生,所以必须实现两个关键虚函数Value()和Derivative()。其代码注释说明了这两个函数的实现细节:
其中F(u)对应函数Value():
DF(u)对应函数Derivative(),最后使用Newton法math_FunctionRoots对方程进行求根。
3 注意事项
OpenCASCADE中点的反求GeomLib_Tool::Parameter()、点向曲线投影GeomAPI_ProjectPointOnCurve、点与曲线的交点IntTools_Context::ComputeVE等算法都是使用了Extrema_ExtPC类。
当使用GeomLib_Tool::Parameter()函数来判断点是否在曲线上时,注意端点处点的反求要满足垂直的条件,即使点与曲线某个端点距离小于MaxDist时,也是返回false。即对于曲线端点处的情况需要自己预先处理,直接算点P与曲线端点距离与MaxDist比较,先处理端点。
可以看到这里也处理的端点处的情况,但是最后没有与MaxDist有关系,最后容差是Precision::SquareConfusion()。
标签:上点,反求,曲线,参数,OpenCASCADE,端点 From: https://www.cnblogs.com/opencascade/p/occt_extrema_pc.html