OpenCASCADE曲线上点的反求
  PulHQ9Eh9mLm 2023年11月30日 17 0

本文主要结合代码介绍OpenCASCADE曲线上点的反求实现原理及使用过程中的一些注意事项。

OpenCASCADE曲线上点的反求

1 Introduction

曲线可以用代数方程表示,如圆可以用X^2+Y^2=R^2表示,也可以用参数方程X(u)=RCos(u), Y(u)=RSin(u)表示。要判断点是不是在线上,用曲线代数方程可以很直接得出结果,但是使用参数方程就没有那么直接。这也是参数曲线上点的反求问题,参数曲线上点的反求问题应用广泛,如前面所述判断点是否在曲线上、点向曲线投影、点与线的求交、点在参数曲线上的参数等,都与点的反求问题相关。本文主要结合代码介绍OpenCASCADE曲线上点的反求实现原理及使用过程中的一些注意事项。

2 实现原理

在《The NURBS Book》书中将点的反求问题归结为点向曲线投影距离最短的问题,如下图所示:

OpenCASCADE曲线上点的反求_极值

建立函数f(u)=C’(u).(C(u) - P)表示点到曲线距离,当f(u)=0时为点到曲线的最短距离,不管点P是否在曲线上。几何意义是点到曲线任意点的向量与任意点处的切向量点积为零,表示在两个向量垂直的时候求得极值点。注意数学方程中垂直这个几何意义。

OpenCASCADE中实现曲线上点的反求原理与《The NURBS Book》书中一致。点的反求使用类GeomLib_Tool::Parameter()函数:

OpenCASCADE曲线上点的反求_代码注释_02

输入曲线、点和最大距离,计算点是否在曲线上及若在曲线上,点对应参数曲线的参数U。

OpenCASCADE曲线上点的反求_实现原理_03

类Extrema_ExtPC计算点P到线C的极值Extrema。根据代码注释可以看出点的反求数学方程与《The NURBS Book》书中一致:

OpenCASCADE曲线上点的反求_实现原理_04

数学方程对应的类的变量为myF,类名为Extrema_FuncExtPC,从类math_FunctionWithDerivative派生,所以必须实现两个关键虚函数Value()和Derivative()。其代码注释说明了这两个函数的实现细节:

OpenCASCADE曲线上点的反求_代码注释_05

其中F(u)对应函数Value():

OpenCASCADE曲线上点的反求_代码注释_06

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比较,先处理端点。

OpenCASCADE曲线上点的反求_实现原理_07

可以看到这里也处理的端点处的情况,但是最后没有与MaxDist有关系,最后容差是Precision::SquareConfusion()。

OpenCASCADE曲线上点的反求_极值_08

 


为了方便大家在移动端也能看到我的博文和讨论交流,现已注册微信公众号,欢迎大家扫描下方二维码关注。


OpenCASCADE曲线上点的反求_代码注释_09




【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月30日 0

暂无评论

推荐阅读
PulHQ9Eh9mLm