OpenCASCADE 参数曲线曲面面积

OpenCASCADE 参数曲线曲面面积

eryar@163.com

Abstract. 本文介绍了参数曲面的第一基本公式,并应用曲面的第一基本公式,结合OpenCASCADE中计算多重积分的类,对任意参数曲面的面积进行计算。

Key Words. Parametric Curve, Parametric Surface, Gauss Integration, Global Properties

1.Introduction

我们知道一元函数y=f(x)的图像是一条曲线,二元函数z=f(x,y)的图像是一张曲面。但是,把曲线曲面表示成参数方程则更加便利于研究,这种表示方法首先是由欧洲瑞士数学家Euler引进的。例如,在空间中的一条曲线可以表示为三个一元函数:

X=x(t), Y=y(t), Z=z(t)

在向量的概念出现后,空间中的一条曲线可以自然地表示为一个一元向量函数:

r=r(t)=(x(t), y(t), z(t))

用向量函数来表示曲线和曲面后,使曲线曲面一些量的计算方式比较统一。如曲线可以表示为一元向量函数,曲面可以表示为二元向量函数。

本文结合OpenCASCADE来介绍参数曲线曲面积分分别计算曲线弧长和曲面的面积。结合《微分几何》来更好地理解曲线曲面相关知识。

2.Curve Natural Parametric Equations

设曲线C的参数方程是r=r(t),命:

wps_clip_image-10887

则s是该曲线的一个不变量,即它与空间中的坐标系的选择无关,也与该曲线的参数变换无关。前者是因为在笛卡尔直角坐标变换下,切向量的长度|r’(t)|是不变的,故s不变。关于后者可以通过积分的变量的替换来证明,设参数变换是:

wps_clip_image-21189

并且

wps_clip_image-16009

因此

wps_clip_image-31864

根据积分的变量替换公式有:

wps_clip_image-29413

不变量s的几何意义就是曲线段的弧长。这说明曲线参数t可以是任意的,但选择不同的参数得到的参数方程会有不同,但是曲线段的弧长是不变的。以曲线弧长作为曲线方程的参数,这样的方程称为曲线的自然参数方程Natural Parametric Equations。

由曲线的参数方程可知,曲线弧长的计算公式为:

wps_clip_image-8988

几何意义就是在每个微元处的切向量的长度求和。

3.Gauss Integration for Arc Length

曲线弧长的计算就是一元函数的积分。OpenCASCADE中是如何计算任意曲线弧长的呢?直接找到相关的源码列举如下:(在类CPnts_AbscissaPoint中)

// auxiliary functions to compute the length of the derivative

static Standard_Real f3d(const Standard_Real X, const Standard_Address C)

{

  gp_Pnt P;

  gp_Vec V;

((Adaptor3d_Curve*)C)->D1(X,P,V);

return V.Magnitude();

}

static Standard_Real f2d(const Standard_Real X, const Standard_Address C)

{

  gp_Pnt2d P;

  gp_Vec2d V;

((Adaptor2d_Curve2d*)C)->D1(X,P,V);

return V.Magnitude();

}

//==================================================================

//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()) {

throw Standard_ConstructionError();

}

return Abs(TheLength.Value());

}

//==================================================================

//function : Length

//purpose  : 2d with parameters

//==================================================================

Standard_Real CPnts_AbscissaPoint::Length(const Adaptor2d_Curve2d& C,

const Standard_Real U1,

const Standard_Real U2)

{

  CPnts_MyGaussFunction FG;

//POP pout WNT

  CPnts_RealFunction rf = f2d;

  FG.Init(rf,(Standard_Address)&C);

//  FG.Init(f2d,(Standard_Address)&C);

  math_GaussSingleIntegration TheLength(FG, U1, U2, order(C));

if (!TheLength.IsDone()) {

throw Standard_ConstructionError();

}

return Abs(TheLength.Value());

}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwsffj.html