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
對(duì)于同一條曲線,選擇的參數(shù)不同其表達(dá)形式也不盡相同。而曲線自身的弧長(zhǎng)是曲線本身的不變量,它與坐標(biāo)系的選擇無(wú)關(guān),因此取曲線的弧長(zhǎng)作為參數(shù)來(lái)研究曲線具有非常重要的意義。以曲線弧長(zhǎng)作為曲線方程的參數(shù),這樣的方程稱為曲線的自然參數(shù)方程。由曲線的自然參數(shù)方程可知曲線的弧長(zhǎng)是曲線參數(shù)方程導(dǎo)數(shù)的積分。所以計(jì)算曲線弧長(zhǎng)的核心算法成了計(jì)算函數(shù)的積分了。
OpenCASCADE中數(shù)學(xué)計(jì)算庫(kù)TKMath中有一種高精度計(jì)算積分的算法Gauss-Legendre積分法,可對(duì)單變量和多變量的函數(shù)進(jìn)行積分計(jì)算。由于OpenCASCADE中曲線是單變量的參數(shù)方程,所以可以用Gauss-Legendre來(lái)計(jì)算積分,進(jìn)而得到曲線的弧長(zhǎng)。如下圖所示:
Figure 1.1 Length of Curve
本文對(duì)曲線的自然參數(shù)方程的概念進(jìn)行說(shuō)明,并簡(jiǎn)要介紹Gauss-Legendre算法及其在OpenCASCADE中的應(yīng)用,即求曲線的弧長(zhǎng)。
2. The Natural Parametric Equations
對(duì)于同一曲線若選擇的參數(shù)不同,則其表達(dá)式亦不同,故用坐標(biāo)系討論曲線時(shí),具有人為的性質(zhì),而曲線自身的弧長(zhǎng)則曲線的不變量,它與坐標(biāo)系的選取無(wú)關(guān)。因此,我們?nèi)∏€自身的弧長(zhǎng)作為參數(shù)來(lái)研究曲線的內(nèi)在性質(zhì)。無(wú)論是理論探索還是實(shí)用研究,弧長(zhǎng)參數(shù)化都有很重要的意義。
給定空間曲線r,在其上任取一點(diǎn)P0(x0, y0, z0)作為計(jì)算弧長(zhǎng)的起點(diǎn)。應(yīng)用弧長(zhǎng)積分公式,即可計(jì)算該曲線上任意點(diǎn)P(x,y,z)到P0之間的弧長(zhǎng)。由此,曲線上點(diǎn)的位置與該點(diǎn)處的弧長(zhǎng)是一一對(duì)應(yīng)的,如下圖所示:
Figure 2.1 Arc length parameterization
即曲線上點(diǎn)的坐標(biāo)是以弧長(zhǎng)為參數(shù)的函數(shù):
由其矢量方程可知,曲線是弧長(zhǎng)為參數(shù)的矢函數(shù),我們將其稱為弧長(zhǎng)參數(shù)化(Arc length parameterization)。弧長(zhǎng)稱為自然參數(shù)(Natural Parameter),曲線方程稱為自然參數(shù)方程(Natural Parametric Equations)。現(xiàn)討論曲線的自然參數(shù)方程與參數(shù)方程的聯(lián)系:已知曲線的矢量方程為:
則弧長(zhǎng)的微分和積分公式分別為:
s(u)即為與參數(shù)u0和u1對(duì)應(yīng)的兩點(diǎn)P0和P之間的弧長(zhǎng)。弧長(zhǎng)參數(shù)化是一類重要的概念,但是如果用上式來(lái)計(jì)算弧長(zhǎng)比較繁瑣,可以通過(guò)累加弦長(zhǎng)方法來(lái)近似計(jì)算。
給定曲線:
令
是參數(shù)軸上的一個(gè)等距分劃;又令
為曲線上與參數(shù)ui對(duì)應(yīng)的點(diǎn)列,則可用下式計(jì)算弦長(zhǎng):
Figure 2.2 Parametric Curve
其中將參數(shù)軸等分越多,則求得的曲線的弧長(zhǎng)越準(zhǔn)確。
3. The Gauss-Legendre Integration
上述累加弦長(zhǎng)的計(jì)算方法應(yīng)該是Newton-Cotes積分計(jì)算法,Newton-Cotes就是將積分區(qū)間等分,并取分點(diǎn)為求積節(jié)點(diǎn)。容易看出當(dāng)積分區(qū)間較大時(shí),直接使用Newton-Cotes公式所得積分近似值的精度是很難保證的。
關(guān)于積分的數(shù)值算法有很多,其中Gauss-Legendre求積公式具有計(jì)算工作量小,所得近似值精確度高等優(yōu)點(diǎn),是一種高精度的求積公式。形式如下所示的求積公式:
代數(shù)精度達(dá)到了2n+1,則稱它為高斯型求積公式,并稱相應(yīng)的求積節(jié)點(diǎn)x0, x1, ... xn為高斯點(diǎn)(Gauss Point)。Ak為求積系數(shù)。
OpenCASCADE的核心模塊的數(shù)學(xué)庫(kù)TKMath中有Gauss-Legendre求積算法,可用來(lái)對(duì)單變量和多變量的函數(shù)進(jìn)行積分計(jì)算,對(duì)應(yīng)的類分別為:math_GaussSingleIntegration和math_GaussMultipleIntegration。計(jì)算所需的高斯點(diǎn)及系數(shù)通過(guò)查表的方式取得,數(shù)據(jù)以數(shù)組的形式在文件math.cxx中列舉出,如下圖所示:
Figure 3.1 Gauss Point for Gauss-Legendre Integration
Gauss-Legendre積分用處之一就是根據(jù)曲線的自然參數(shù)方程計(jì)算曲線的弧長(zhǎng),代碼實(shí)現(xiàn)如下所示:
//=====================================================================
//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());
}
根據(jù)上述求曲線弧長(zhǎng)的代碼可知,只需要給定曲線及其求積區(qū)間,即可計(jì)算出此區(qū)間內(nèi)曲線的弧長(zhǎng)。因?yàn)椴捎弥苯忧蠓e計(jì)算,所得曲線的弧長(zhǎng)值的精度還是很高的。
高斯型求積公式是一種高精度的求積公式。在求積節(jié)點(diǎn)數(shù)相同,即計(jì)算工作量相近的情況下,利用高斯型求積公式往往可以獲得準(zhǔn)確程序較高的積分近似值。但是,它必須在不等距的節(jié)點(diǎn)上計(jì)算被積函數(shù)的值,而且當(dāng)節(jié)點(diǎn)數(shù)改變時(shí),所用數(shù)據(jù)都要重新查表計(jì)算。
4. Conclusion
曲線自身的弧長(zhǎng)是曲線本身的不變量,它與坐標(biāo)系的選擇無(wú)關(guān),因此取曲線的弧長(zhǎng)作為參數(shù)來(lái)研究曲線具有非常重要的意義。以曲線弧長(zhǎng)作為曲線方程的參數(shù),這樣的方程稱為曲線的自然參數(shù)方程。由曲線的自然參數(shù)方程可知曲線的弧長(zhǎng)是曲線參數(shù)方程導(dǎo)數(shù)的積分。所以計(jì)算曲線弧長(zhǎng)的核心算法成了計(jì)算函數(shù)的積分了。
在《計(jì)算方法》、《數(shù)值分析》等教材中都有關(guān)于求積分的算法,在OpenCASCADE中實(shí)現(xiàn)了Gauss-Legendre求積算法。Gauss-Legendre求積算法是一種高精度的求積方法。所以根據(jù)曲線的自然參數(shù)方程可知曲線弧長(zhǎng)就是對(duì)曲線參數(shù)方程導(dǎo)數(shù)的求積分。所以使用高斯求積法可以得到曲線弧長(zhǎng)較精確值。
對(duì)數(shù)值積分的具體算法感興趣的朋友,可以參考《計(jì)算方法》、《數(shù)值分析》、《數(shù)值計(jì)算》等相關(guān)書(shū)籍。
5. References
1. 朱心雄. 自由曲線曲面造型技術(shù). 科學(xué)出版社. 2008
2. 王仁宏, 李崇君, 朱春鋼. 計(jì)算幾何教程. 科學(xué)出版社. 2008
3. 易大義, 沈云寶, 李有法. 計(jì)算方法. 浙江大學(xué)出版社. 2002
4. 易大義, 陳道琦. 數(shù)值分析引論. 浙江大學(xué)出版社. 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