文档章节

OpenCASCADE Curve Length Calculation

eryar
 eryar
发布于 2014/11/23 12:33
字数 1807
阅读 55
收藏 0

OpenCASCADE Curve Length Calculation

eryar@163.com

Abstract. The natural parametric equations of a curve are parametric equations that represent the curve in terms of a coordinate-independent parameter, generally arc length s, instead of an arbitray variable like t or u. According to the natural equations, the curve length is the integration of the curve parametric equation’s derivation. So the core algorithm for curve length calculation is the numerical integration method. OpenCASCADE use Gauss-Legendre to calculate the integration for single variable and multiple variables. Because of curve in OpenCASCADE is single variable function, so can use the Gauss-Legendre to calculate the arc length for the curve. 

Key Words. OpenCASCADE, The Gauss-Legendre Integration, Parametric Curve,  

          The Natural Parametric Equations,  Arc Length, 

  

1. Introduction

对于同一条曲线,选择的参数不同其表达形式也不尽相同。而曲线自身的弧长是曲线本身的不变量,它与坐标系的选择无关,因此取曲线的弧长作为参数来研究曲线具有非常重要的意义。以曲线弧长作为曲线方程的参数,这样的方程称为曲线的自然参数方程。由曲线的自然参数方程可知曲线的弧长是曲线参数方程导数的积分。所以计算曲线弧长的核心算法成了计算函数的积分了。 

OpenCASCADE中数学计算库TKMath中有一种高精度计算积分的算法Gauss-Legendre积分法,可对单变量和多变量的函数进行积分计算。由于OpenCASCADE中曲线是单变量的参数方程,所以可以用Gauss-Legendre来计算积分,进而得到曲线的弧长。如下图所示: 

wps_clip_image-27897

Figure 1.1 Length of Curve 

本文对曲线的自然参数方程的概念进行说明,并简要介绍Gauss-Legendre算法及其在OpenCASCADE中的应用,即求曲线的弧长。

2. The Natural Parametric Equations

对于同一曲线若选择的参数不同,则其表达式亦不同,故用坐标系讨论曲线时,具有人为的性质,而曲线自身的弧长则曲线的不变量,它与坐标系的选取无关。因此,我们取曲线自身的弧长作为参数来研究曲线的内在性质。无论是理论探索还是实用研究,弧长参数化都有很重要的意义。 

给定空间曲线r,在其上任取一点P0(x0, y0, z0)作为计算弧长的起点。应用弧长积分公式,即可计算该曲线上任意点P(x,y,z)到P0之间的弧长。由此,曲线上点的位置与该点处的弧长是一一对应的,如下图所示: 

wps_clip_image-1600

Figure 2.1 Arc length parameterization 

即曲线上点的坐标是以弧长为参数的函数: 

wps_clip_image-21590

由其矢量方程可知,曲线是弧长为参数的矢函数,我们将其称为弧长参数化(Arc length parameterization)。弧长称为自然参数(Natural Parameter),曲线方程称为自然参数方程(Natural Parametric Equations)。现讨论曲线的自然参数方程与参数方程的联系:已知曲线的矢量方程为: 

wps_clip_image-2116

则弧长的微分和积分公式分别为: 

wps_clip_image-3606

s(u)即为与参数u0和u1对应的两点P0和P之间的弧长。弧长参数化是一类重要的概念,但是如果用上式来计算弧长比较繁琐,可以通过累加弦长方法来近似计算。 

给定曲线: 

wps_clip_image-25405

wps_clip_image-3494是参数轴上的一个等距分划;又令wps_clip_image-14274为曲线上与参数ui对应的点列,则可用下式计算弦长: 

wps_clip_image-2194

wps_clip_image-1829

Figure 2.2 Parametric Curve 

其中将参数轴等分越多,则求得的曲线的弧长越准确。 

3. The Gauss-Legendre Integration

上述累加弦长的计算方法应该是Newton-Cotes积分计算法,Newton-Cotes就是将积分区间等分,并取分点为求积节点。容易看出当积分区间较大时,直接使用Newton-Cotes公式所得积分近似值的精度是很难保证的。 

关于积分的数值算法有很多,其中Gauss-Legendre求积公式具有计算工作量小,所得近似值精确度高等优点,是一种高精度的求积公式。形式如下所示的求积公式: 

wps_clip_image-23833

代数精度达到了2n+1,则称它为高斯型求积公式,并称相应的求积节点x0, x1, ... xn为高斯点(Gauss Point)。Ak为求积系数。 

OpenCASCADE的核心模块的数学库TKMath中有Gauss-Legendre求积算法,可用来对单变量和多变量的函数进行积分计算,对应的类分别为:math_GaussSingleIntegration和math_GaussMultipleIntegration。计算所需的高斯点及系数通过查表的方式取得,数据以数组的形式在文件math.cxx中列举出,如下图所示: 

wps_clip_image-14378

Figure 3.1 Gauss Point for Gauss-Legendre Integration 

Gauss-Legendre积分用处之一就是根据曲线的自然参数方程计算曲线的弧长,代码实现如下所示: 

//=====================================================================
//function : Length
//purpose  : 3d with parameters
//=====================================================================

Standard_Real CPnts_AbscissaPoint::Length(const Adaptor3d_Curve& C,
                      const Standard_Real U1,
                      const Standard_Real U2) 
{
  CPnts_MyGaussFunction FG;
//POP pout WNT
  CPnts_RealFunction rf = f3d;
  FG.Init(rf,(Standard_Address)&C);
//  FG.Init(f3d,(Standard_Address)&C);
  math_GaussSingleIntegration TheLength(FG, U1, U2, order(C));
  if (!TheLength.IsDone()) {
    Standard_ConstructionError::Raise();
  }
  return Abs(TheLength.Value());
}

根据上述求曲线弧长的代码可知,只需要给定曲线及其求积区间,即可计算出此区间内曲线的弧长。因为采用直接求积计算,所得曲线的弧长值的精度还是很高的。 

高斯型求积公式是一种高精度的求积公式。在求积节点数相同,即计算工作量相近的情况下,利用高斯型求积公式往往可以获得准确程序较高的积分近似值。但是,它必须在不等距的节点上计算被积函数的值,而且当节点数改变时,所用数据都要重新查表计算。 

4. Conclusion

曲线自身的弧长是曲线本身的不变量,它与坐标系的选择无关,因此取曲线的弧长作为参数来研究曲线具有非常重要的意义。以曲线弧长作为曲线方程的参数,这样的方程称为曲线的自然参数方程。由曲线的自然参数方程可知曲线的弧长是曲线参数方程导数的积分。所以计算曲线弧长的核心算法成了计算函数的积分了。 

在《计算方法》、《数值分析》等教材中都有关于求积分的算法,在OpenCASCADE中实现了Gauss-Legendre求积算法。Gauss-Legendre求积算法是一种高精度的求积方法。所以根据曲线的自然参数方程可知曲线弧长就是对曲线参数方程导数的求积分。所以使用高斯求积法可以得到曲线弧长较精确值。 

对数值积分的具体算法感兴趣的朋友,可以参考《计算方法》、《数值分析》、《数值计算》等相关书籍。 

5. References

1. 朱心雄. 自由曲线曲面造型技术. 科学出版社. 2008 

2. 王仁宏, 李崇君, 朱春钢. 计算几何教程. 科学出版社. 2008 

3. 易大义, 沈云宝, 李有法. 计算方法. 浙江大学出版社. 2002 

4. 易大义, 陈道琦. 数值分析引论. 浙江大学出版社. 1998 

5. http://mathworld.wolfram.com/NaturalParametricEquations.html

6. http://mathworld.wolfram.com/Legendre-GaussQuadrature.html

7. http://en.wikipedia.org/wiki/Gaussian_quadrature

8. http://pomax.github.io/bezierinfo/legendre-gauss.html

 

© 著作权归作者所有

eryar
粉丝 22
博文 127
码字总数 227012
作品 0
武汉
私信 提问
Building OpenCascade on Windows with Visual Studio

Building OpenCascade on Windows with Visual Studio eryar@163.com 摘要Abstract:详细说明OpenCascade的编译配置过程,希望对你编译OpenCascacde有所帮助。本文内容来自OCCT的Overview文档...

eryar
2013/09/23
520
0
OpenCASCADE Make Primitives-Box

OpenCASCADE Make Primitives-Box eryar@163.com Abstract. By making a simple box to demonstrate the BRep data structure of the OpenCASCADE. The construction method is different fr......

eryar
2014/11/23
243
0
如何将openCASCADE和c++结合起来,哪位牛人能不能给我指点指点啊.

如何将openCASCADE和c++结合起来,哪位牛人能不能给我指点指点啊.我现在正想用openCASCADE和c++结合起来做一个像cad软件的东西。

chenchenxixi
2012/07/09
1K
2
FreeCAD 0.16 和 0.17 修正版发布

FreeCAD 0.16 和 0.17 修正版发布,FreeCAD是一个基于OpenCASCADE的开源CAD/CAE工具。 OpenCASCADE是一套开源的CAD/CAM/CAE几何模型核心,来自法国Matra Datavision公司,是著名的CAD软件EUC...

周其
2017/12/11
1K
4
编译时的冲突问题

我现在希望同时使用两套开源的图形学方面的软件包,他们是openCASCADE和CGAL。 但我在使用中发现下面的问题: openCASCADE定义了下面的宏 # define Handle(ClassName) Handle_##ClassName --...

梁全
2009/07/25
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

崛起于Springboot2.X之5分钟解决单点登陆(53)

SpringBoot2.X心法总纲 1、pom文件依赖 <dependency> <groupId>com.majiaxueyuan</groupId> <artifactId>sso-core</artifactId> <version>1.2.2</version></dependency> 2、......

木九天
22分钟前
16
0
面向对象和面向过程的区别

面向过程 优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。 缺点:没有面向对...

无名氏的程序员
24分钟前
12
0
OpenStack大事记

2010年7月19日,Rackspace、NASA、Citrix、Dell共同开发并发布OpenStack第一个版本。 2011年10月,Rackspace放弃OpenStack控制权,交由一新成立的OpenStack基金会管理。 2012年5月NASA宣布退...

大别阿郎
24分钟前
10
0
面向对象的简单应用—以交通工具(Vehicle)为列

请定义一个交通工具(Vehicle)的类其中有: 属性: 速度(speed)、 体积(size)等,方法:移动(move())、设置速度(setSpeed(int speed))、加速 speedUp()、减速 speedDown()等。最后在测试类 Ve...

INEVITABLE
35分钟前
9
0
通往艺术家之路

通往艺术家之路 并发编程中,开发者往往需要权衡锁的颗粒粗细,锁住的代码块太大呢会导致可能的线程堵塞,锁的颗粒太细呢又会因为频繁地加锁解锁导致系统用户态内核态的转换从而消费很多时间...

StupidZhe
36分钟前
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部