B-スプライン曲線


  1. B-スプライン曲線

    1. B-スプライン曲線の特徴
      B-スプライン曲線は、指定された制御多角形の内部に描かれるパラメトリック曲線です。下に5点を制御点とする、B-スプライン曲線の例を示します。
       B-スプライン曲線の特徴として、局所性が挙げられます。これは、特定の制御点を移動した場合、影響を受ける範囲は、制御点の近傍に限定され、離れた部分の曲線には影響を与えない、という性質です。



    2. 基底関数の例
      B-スプライン曲線 r(t) は基底関数を Ni,k 、制御点をPi とすると、
       
       r(t)=ΣNi,k(t)Pi

      で定義されます。上の例での基底関数 Ni,k(t) のグラフは下のようになります。左から、5個のグラフがあります。横軸は t (0<t<5))で、縦軸のグラフの最大値(左右両端)が1になります。

       

      各  Ni,k(t) が制御点 Pi に対する重み付けを連続的に調整し、制御点にしたがう曲線を生成しています。

    3. 基底関数とノットベクトル
       基底関数は ノットベクトル と呼ばれる 
       (t0,t1,t2,t3,t4,..) ti < ti+1
      により特徴づけられます。
      上の基底関数はノットベクトル [ 0,0,0,1,2,3,3,3 ] で生成されています。
       Bースプライン関数はこのノットベクトルにより形を変えますから、生成される曲線の形状も一定ではありません。
       Ni,k(t)は次のように、再帰的に定義されます。
       
       Ni,1(t) = 1 ti < t <= ti+1
             0 それ以外

       Ni,k(t)=((t-ti)/(ti+k-1-ti))Ni,k-1(t) + ((ti+k-t)/(ti+k-ti+1))Ni+1,k-1(t)
       
      ここで、分母が0になる場合、その項はないもの(0とする)として扱います。

    4. ユニフォームBスプライン
       ノットベクトルが、[0,1,2,3,4,5,6,7] のように、等間隔の整数の時、ユニフォームBスプラインといいます。この場合の基底関数は、次のようになります。このときの、tの範囲は [0,7]となります。
       


       各制御点に対する基底関数の形状は同一になります。各基底関数は中心と前後の点のみに作用します。3種の関数がすべて定義されていない両端では、曲線は定義されません。例えば、t=0 となる最左点では、基底関数は0(または未定義)ですから、曲線の点は (0,0) になってしまいます。したがって、曲線が定義されるtの範囲は [2,5] となります。

  2. プログラム
    1. 基底関数の計算
       Ni,k(t) の値を計算するメソッドをbaseNとします。nv[] はノットベクトルです。一般には、ノットベクトルと階数を定めると、tの関数として計算できますから、あらかじめ t の関数とする方が効率的です。
       double baseN(int i,int k,double t,int nv[]){
          double w1=0.0,w2=0.0;
          if(k==1){
            if(t >=nv[i] && t<nv[i+1]) return 1.0;
            else return 0.0;
          }
          else {
            if((nv[i+k]-nv[i+1])!=0){
              w1=((nv[i+k]-t)/(nv[i+k]-nv[i+1])) * baseN(i+1,k-1,t,nv);
            }
            if((nv[i+k-1]-nv[i]) !=0 ){
              w2=((t-nv[i])/(nv[i+k-1]-nv[i])) * baseN(i,k-1,t,nv);
            }
            return (w1+w2);
          }
        }

    2. 基底関数表示
       5本の基底関数を同時に表示するため、tと対応する基底関数の値を配列 spx[]とspy[] に計算しておき、これをまとめて表示しています。

    3. プログラムの利用法
       基底関数と曲線の表示をボタンで選択できます。制御点はマウスでドラッグできます。利用するノットベクトルは2種を選択できます。ノットベクトルを切り替えても表示は変化しません。ボタンを押してください。



    4. ソース
       このプログラムのソースはこちらにあります。