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

OpenCASCADE曲线上点的反求

eryar@163.com

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()。

 


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