1. 程式人生 > >B樣條基函式——B-Spline Basis Functions

B樣條基函式——B-Spline Basis Functions

B-Spline Basis Functions

    摘要Abstract:直接根據B樣條的Cox-deBoor遞推定義寫出計算B樣條基函式的程式,並將計算結果在OpenSceneGraph中顯示。

   關鍵字Key Words:B Spline Basis Functions、OpenSceneGraph

一、概述Overview

有很多方法可以用來定義B樣條基函式以及證明它的一些重要性質。例如,可以採用截尾冪函式的差商定義,開花定義,以及由de Boor和Cox等人提出的遞推公式等來定義。我們這裡採用的是遞推定義方法,因為這種方法在計算機實現中是最有效的。

令U={u0,u1,…,um}是一個單調不減的實數序列,即ui<=ui+1,i=0,1,…,m-1。其中,ui稱為節點,U稱為節點向量,用Ni,p(u)表示第i個p次B樣條基函式,其定義為:

wps_clip_image-29792

B樣條基有如下性質:

a) 遞推性;

b) 區域性支承性;

c) 規範性;

d) 可微性;

二、程式 Codes

直接根據B樣條基函式的Cox-deBoor遞推定義,寫出計算B樣條基函式的程式如下:

標頭檔案BSplineBasisFunction.h:

/*
*    Copyright (c) 2013 eryar All Rights Reserved.
*
*        File    : BSplineBasisFunction.h
*        Author  : [email protected]
*        Date    : 2013-03-23 22:13
*        Version : V1.0
*
*    Description : Use Cox-deBoor formula to implemente the 
*                  B-Spline Basis functions.
*
*/

#ifndef _BSPLINEBASISFUNCTION_H_
#define _BSPLINEBASISFUNCTION_H_

#include 
<vector>

class BSplineBasisFunction
{
public:
    BSplineBasisFunction(
const std::vector<double
>& U);
    
~BSplineBasisFunction(void);

public:
    
/*
    * @brief Binary search of the knot vector.
    
*/

    
int FindSpan(double u);

    
/*
    * @brief 
    * @param [in] i: span of the parameter u;
    *        [in] p: degree;
    *        [in] u: parameter;
    
*/

    
double EvalBasis(int i, int p, double u);

    
/*
    * @breif Get knot vector size.
    
*/

    
int GetKnotVectorSize(voidconst;

    
/*
    * @breif Get the knot value of the given index.
    
*/

    
double GetKnot(int i) const;

private:
    std::vector
<double> mKnotVector;
}
;

#endif// _BSPLINEBASISFUNCTION_H_



實現檔案BSplineBasisFunction.cpp:

/*
*    Copyright (c) 2013 eryar All Rights Reserved.
*
*        File    : BSplineBasisFunction.cpp
*        Author  : [email protected]
*        Date    : 2013-03-23 22:14
*        Version : V1.0
*
*    Description : Use Cox-deBoor formula to implemente the 
*                  B-Spline Basis functions.
*
*/


#include 
"BSplineBasisFunction.h"

BSplineBasisFunction::BSplineBasisFunction( 
const std::vector<double>& U )
    :mKnotVector(U)
{

}



BSplineBasisFunction::
~BSplineBasisFunction(void)
{
}


int BSplineBasisFunction::GetKnotVectorSize( void ) const
{
    
return static_cast<int> (mKnotVector.size());
}


double BSplineBasisFunction::GetKnot( int i ) const
{
    
return mKnotVector[i];
}


/*
* @brief Binary search of the knot vector.
*/

int BSplineBasisFunction::FindSpan( double u )
{
    
int iSize = static_cast<int> (mKnotVector.size());

    
if (u >= mKnotVector[iSize-1])
    
{
        
return iSize;
    }


    
int iLow =0;
    
int iHigh = iSize;
    
int iMiddle = (iLow + iHigh) /2;

    
while (u < mKnotVector[iMiddle] || u > mKnotVector[iMiddle+1])
    
{
        
if (u < mKnotVector[iMiddle])
        
{
            iHigh 
= iMiddle;
        }

        
else
        
{
            iLow 
= iMiddle;
        }


        iMiddle 
= (iLow + iHigh) /2;
    }


    
return iMiddle;
}


double BSplineBasisFunction::EvalBasis( int i, int p, double u )
{
    
if ((i+p+1>= GetKnotVectorSize())
    
{
        
return0;
    }


    
if (0== p)
    
{
        
if (u >= mKnotVector[i] && u < mKnotVector[i+1])
        
{
            
return1;
        }
 
        
else
        
{
            
return0;
        }

    }


    
double dLeftUpper = u - mKnotVector[i];
    
double dLeftLower = mKnotVector[i+p] - mKnotVector[i];
    
double dLeftValue =0;

    
double dRightUpper = mKnotVector[i+p+1- u;
    
double dRightLower = mKnotVector[i+p+1- mKnotVector[i+1];
    
double dRightValue =0;

    
if (dLeftUpper !=0&& dLeftLower !=0)
    
{
        dLeftValue 
= (dLeftUpper / dLeftLower) * EvalBasis(i, p-1, u);
    }


    
if (dRightUpper !=0&& dRightLower !=0)

相關推薦

B函式——B-Spline Basis Functions

B-Spline Basis Functions     摘要Abstract:直接根據B樣條的Cox-deBoor遞推定義寫出計算B樣條基函式的程式,並將計算結果在OpenSceneGraph中顯示。    關鍵字Key Words:B Spline Basis Functions、OpenScene

B-spline Curves 學習之B函式的定義與性質(2)

轉自:http://www.cnblogs.com/icmzn/p/5100761.html B-spline Basis Functions:Definition   貝塞爾基函式用作權重。B-樣條基函式也一樣;但更復雜。但是它有兩條貝塞爾基函式所沒有的特性,即(1

B曲線(B-spline Curves)

關鍵字:NURBS,基函式,控制點,節點, 看了網上很多相關資料才得以下筆,資料太多,這裡就不一一列舉了,感謝各位大佬的資料 本部落格順序不太好,看前面的東西可能需要提前看後面的東西。正在努力修煉,敬請諒解 寫了個B樣條曲線計算的完成程式,包括繪圖,https://

B-spline Curves 學習之B曲線定義(4)

轉自:http://www.cnblogs.com/icmzn/p/5100789.html   給定 n + 1個控制點P0, P1, ..., Pn 和一個節點向量U = { u0, u1, ..., um },  p 次B-樣條曲線由這些控制點和節點向量U 定義  

B-spline Curves 學習之B曲線的移動控制點、修改節點分析(7)

轉自:http://www.cnblogs.com/icmzn/p/5101424.html   B-樣條曲線:移動控制點   移動控制點是改變B-樣條曲線形狀的最明顯的方法。在前面頁討論的區域性修改方案說明了修改控制點 Pi 的位置僅影響在區間[ui, ui+p+1)

問題六十一:三次b(b-spline)曲線的控制點和曲線形狀的對應——以迴旋體的“基本曲線”為例

在這一章節,我們以其中一段曲線段為例,改變其對應的控制點,看看曲線段形狀的改變,同時也看看對應的迴旋體圖形的改變。 控制點座標如下圖: “問題六十”中的“基本曲線”的控制點對應如上ABCDEF六個點(其中A點在1位置)。對應輸出的迴旋體圖形如下(再次貼出來): 說

課堂筆記_ B曲線和NUBRS

為什麼學習B樣條 Bezier曲線/曲面不支援區域性的修改和編輯; Bezier曲線/曲面拼接時,滿足幾何連續條件是十分困難的。 B樣條的歷史 1946年,Schoenberg提出了一種基於樣條的方法來近似曲線; B樣條的動機源於插值中的Ru

計算機圖形學--------充分理解B曲線

樣條(spline)二字,從英文翻譯過來的,讓人費解。B樣條的數學定義更是讓人匪夷所思。看了好幾本參考教材,還是把總結一下B樣條這個概念。 一、解釋什麼是樣條。 實際應用中,樣條是一根富有彈性的細木條或塑料條。在應用CAD/CAM技術以前,航空、船舶和汽車製造業普遍採用手

B-曲線:定義

其中 Ni,p(u)是 p次B-樣條基函式。  B-樣條曲線形式與貝塞爾曲線相似 。不像貝塞爾曲線, B-樣條曲線包含更多資訊,即:一系列的 n+1 個控制點, m+1個節點的節點向量,次數 p。 注意n, m 和 p必須滿足m = n + p + 1。更準確地,如果我們想要定義一個有 n + 1控制點的p次

[摘抄] Bezier曲線、B和NURBS

  Bezier曲線、B樣條和NURBS,NURBS是Non-Uniform Rational B-Splines的縮寫,都是根據控制點來生成曲線的,那麼他們有什麼區別了?簡單來說,就是: Bezier曲線中的每個控制點都會影響整個曲線的形狀,而B樣條中的控制點只會影響整個曲線的一部分,顯然B樣條提供了

OpenGL 繪制B曲線

ember direction onexit cti target get 說明 spa glbegin http://blog.csdn.net/yangtrees/article/details/9026411 繪制B樣條曲線: #include <stdli

從零開始的openGL——四、紋理貼圖與n次B曲線

前言 在上篇文章中,介紹瞭如何載入繪製模型以及滑鼠互動的實現,並且遺留了個問題,就是沒有模型表面沒有紋理,看起來很醜。這篇文章將介紹如何貼紋理,以及曲線的繪製。 紋理貼圖 紋理載入 既然是貼圖,那首先我們得要有合適的紋理圖片,openGL中支援的圖片為bmp格式。在這裡我還用到了個額外的庫glaux,但當時在

【 MATLAB 】MATLAB 實現模擬訊號取樣後的重建(三)應用三次函式spline實現內插

前三篇博文講了三種方法進行內插重建訊號: 這篇文章使用三次樣條函式spline來實現內插重建,並分析重建誤差。 採用的案例依然是上篇博文中的案例: 模擬訊號: 對該訊號使用兩種不

函式spline function)—— 分段多項式函式(piecewise polynomial function)

1. 分段多項式函式 樣條函式是某種意義上的分段函式。 最簡單的樣條函式是一種分段多項式函式(piecewise polynomial function),樣條函式 S:[a,b]→R。

【HDOJ5528】Count a * b(積性函式

題意:設f(i)為0<=x,y<=i-1且xy%i=0的(x,y)對數,g(i)為sigma f(j) [i%j==0] 給定n,求g(n),答案對2^64取模 T<=2e4,n<=1e9 思路:這題堅定了我要找一個專業數學手的決心…… x,y從[0,i-1]等價於從[1,i]

薄板插值---TPS(Thin Plate Spline)

薄板樣條插值—TPS(Thin Plate Spline) 插值 已知一系列的觀測點 ( x

(光滑)Smoothing spline的數學推導

Smoothing spline的數學推導 參考斯坦福統計學習原理 光滑樣條的精髓在於在原本的擬合誤差的基礎上加了一個λ∫{f′′(t)}2dt\lambda\int\left\{f^{&#x27;&#x27;}(t)\right\}^{2}dt

徑向-薄板插值數學公式、原理,以及程式碼實現基本過程

徑向基插值部分 徑向基函式RBF (Radial Basis Function)有以下五種基函式 其中r代表代待求點X與已知點Xi之間的向量距離 上邊的公式是適用於以上五種基函式的計算公式,其中X代表向量,不是一個數字 對於薄板樣條插值,其公式(是經過上邊

ThinkPHP單字母函式整理 A函式 B函式 C函式 D函式 F函式 L函式 R函式 S函式 U函式

有人不太喜歡TP這種單字母函式,其實這也是TP的一個特色,如果理解了這些函式的作用,不管是背,還是寫,都是非常方便的,接下來我們以字母順序開始。   A函式(基本是Action的簡寫)   A函式是用來例項化我們的Action類的,例如我們的程式有2個Action分別是Inde

藍橋 鹼 java b組 國賽

鹼基 生物學家正在對n個物種進行研究。 其中第i個物種的DNA序列為s[i],其中的第j個鹼基為s[i][j],鹼基一定是A、T、G、C之一。 生物學家想找到這些生物中一部分生物的一些共性,他們現在關注那些至少在m個生物中出現的 長度為k的連續鹼基序列。準確的說,科學家關心的序