1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

実装技術者向けB-スプライン曲線入門

Last updated at Posted at 2025-11-05

はじめに

B-スプライン曲線を実装するために必要な事柄をまとめた解説を作成しました。
ベジェ曲線に変換して描画する方法の、導出過程や実装例を含めました。
以下の3種類のB-スプライン曲線、次数は3が対象です。NURBSは含みません。

一様/uniform 閉じた/closed
または
periodic
開一様/open uniform
または
クランプされた/clamped
gp0open.png gp0closed.png gp0clamped.png

※開一様B-スプライン曲線は、ノットベクトルに重ね合わせが含まれるため一様ではないとする場合もありますが、重ね合わせはノットベクトルの中間ではなく端にあるので、ここでは一様とします。(中間にあるか端にあるかは大きな違いです)

B-スプライン曲線の定義

B-スプライン曲線はパラメトリック曲線で、パラメトリック変数(またはパラメータ)$t$の$n$次関数で表現されます。
各制御点の$x$、$y$座標に、$t$の$n$次関数である基底関数(basis function)を乗じた和が、曲線上の$x$、$y$座標になります。
次数$n$を$3$、制御点の数を$m$($m\geq n+1$)とすると;

\begin{array}{ll}
x=f(t)=b_{0,3}(t)P_{0_x}+b_{1,3}(t)P_{1_x}+ \dots +b_{m-1,3}(t)P_{{m-1}_x} \\
y=g(t)=b_{0,3}(t)P_{0_y}+b_{1,3}(t)P_{1_y}+ \dots +b_{m-1,3}(t)P_{{m-1}_y}
\end{array}

$b_{0,3}(t)$~$b_{m-1,3}(t)$ は基底関数です。
$[f(t),g(t)]=\boldsymbol{S}(t)$、$[P_{i_x},P_{i_y}]=\boldsymbol{P}_i$ とすると、以下のバーンスタイン表現になります。

\boldsymbol{S}(t)=\sum_{i=0}^{m-1}b_{i,n}(t)\boldsymbol{P}_i

B-スプライン曲線の基底関数はde Boor-Coxの漸化式(recursion formula)で定義されます。

\begin{align}
&b_{i,0}(t) = 
\left
\{
\begin{array}{ll}
1 & if \quad t_i \leq t < t_{i+1} \\
0 & otherwise
\end{array}
\right. \\
&b_{i,k}(t) =
\frac{t-t_i}{t_{i+k}-t_i} b_{i,k-1}(t) +
\frac{t_{i+k+1}-t}{t_{i+k+1}-t_{i+1}}  b_{i+1,k-1}(t)
\end{align}

$t_i$はノットベクトル(knot vector)で $m+n+1$ 個の数値列です。ノットベクトルにより曲線の特性を調節することが出来ます。
基本となる一様(uniform)B-スプライン曲線のノットベクトルは、単調増加(uniformly spaced)の数列です。以下は $n=3$、$m=4$ のノットベクトルの例です。

\begin{bmatrix} t_0 & t_1 & t_2 & t_3 & t_4 & t_5 & t_6 & t_7 \end{bmatrix} = \begin{bmatrix} 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 \end{bmatrix}

このノットベクトルの場合の基底関数と曲線の例は以下の通りになります。
$t$の値域は$3\leq t<4$になります。曲線の始点と終点は制御点に重なりません。
 gp3.png gp4.png

ノットベクトル、基底関数、制御点の関係は以下の図のようになります。
 g01a.png

$t_3\leq t<t_4$の場合に0階の$b_{3,0}$が1になり、1階の$b_{2,1}$~$b_{3,1}$、2階の$b_{1,2}$~$b_{3,2}$、3階の$b_{0,3}$~$b_{3,3}$が順次決定されます。
有効な要素は、上図のような三角形状の配列(triangular array)になります。
これら以外の要素は計算不要です。また、これら以外を参照する項は計算不要です。

ノットベクトルの加工

値域を変更する

漸化式の計算はノット間の差と比なので、ノットベクトル全体に定数を加えたり乗じたりすることで$t$の値域を任意に変更することができます。
以下は同じ曲線になります。

ノットベクトル tの値域
$ \begin{bmatrix} 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 \end{bmatrix} $ $3\leq t<4$
$ \begin{bmatrix} -3 & -2 & -1 & 0 & 1 & 2 & 3 & 4 \end{bmatrix} $ $0\leq t<1$
$ \begin{bmatrix} 0 & 0.5 & 1 & 1.5 & 2 & 2.5 & 3 & 3.5 \end{bmatrix} $ $1.5\leq t<2$

両端のノットは任意

ノットベクトルの両端の要素($t_0, t_7$)は基底関数の計算に使用されません。

基底関数の式展開、行列形式

以下はSage MathでB-スプライン曲線の基底関数を式展開した例です。
$b_{2,1}$~$b_{3,1}$は$t$の1次関数、$b_{1,2}$~$b_{3,2}$は$t$の2次関数、$b_{0,3}$~$b_{3,3}$は$t$の3次関数になります。各項の係数はノットベクトルにより異なります。

B-スプライン曲線の基底関数を式展開する
var ('t')
tk=[-3, -2, -1, 0, 1, 2, 3, 4]
b30=1
b21=                            (tk[4]-t)/(tk[4]-tk[3])*b30
b31=(t-tk[3])/(tk[4]-tk[3])*b30
b12=                            (tk[4]-t)/(tk[4]-tk[2])*b21
b22=(t-tk[2])/(tk[4]-tk[2])*b21+(tk[5]-t)/(tk[5]-tk[3])*b31
b32=(t-tk[3])/(tk[5]-tk[3])*b31
b03=                            (tk[4]-t)/(tk[4]-tk[1])*b12
b13=(t-tk[1])/(tk[4]-tk[1])*b12+(tk[5]-t)/(tk[5]-tk[2])*b22
b23=(t-tk[2])/(tk[5]-tk[2])*b22+(tk[6]-t)/(tk[6]-tk[3])*b32
b33=(t-tk[3])/(tk[6]-tk[3])*b32
b21.simplify_full()
b31.simplify_full()
b12.simplify_full()
b22.simplify_full()
b32.simplify_full()
b03.simplify_full()
b13.simplify_full()
b23.simplify_full()
b33.simplify_full()
実行結果
-t + 1
t
1/2*t^2 - t + 1/2
-t^2 + t + 1/2
1/2*t^2
-1/6*t^3 + 1/2*t^2 - 1/2*t + 1/6
1/2*t^3 - t^2 + 2/3
-1/2*t^3 + 1/2*t^2 + 1/2*t + 1/6
1/6*t^3

式展開した$b_{0,3}$~$b_{3,3}$を用いて、B-スプライン曲線を行列形式(matrix form)で表現することができます。以下の式で$\boldsymbol{R_{bsp}}$を係数行列と呼びます。

\boldsymbol{S}(t)=
\begin{bmatrix}
t^3 & t^2 & t & 1
\end{bmatrix}
\boldsymbol{R_{bsp}}
\begin{bmatrix}
{\boldsymbol{P}}_0 \\
{\boldsymbol{P}}_1 \\
{\boldsymbol{P}}_2 \\
{\boldsymbol{P}}_3
\end{bmatrix}
\boldsymbol{R_{bsp}}=
\begin{bmatrix}
-\frac{1}{6} & \frac{1}{2} & -\frac{1}{2} & \frac{1}{6} \\
\frac{1}{2} & -1 & \frac{1}{2} & 0 \\
-\frac{1}{2} & 0 & \frac{1}{2} & 0 \\
\frac{1}{6} & \frac{2}{3} & \frac{1}{6} & 0
\end{bmatrix}

制御点を増やす

B-スプライン曲線は次数を変えずに制御点を任意に増やすことができます。制御点に応じてノットも増えるので、基底関数の三角形状が上下方向にひろがります。制御点を5個($m=5$)に増やした場合のノットベクトル、基底関数、制御点の関係は以下の図のようになります。
 g02a.png

以下はノットベクトルの例です。
 $ \begin{bmatrix} 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 \end{bmatrix} $

この場合の基底関数と曲線の例は以下の通りになります。
基底関数は $m=4$ と同じものが2つ並んだ形状になります。

 gp5.png gp6a.png

曲線を分割する

上記の場合の$t$の値域は$3\leq t<5$ですが、$b_{3,0}$と$b_{4,0}$は同時に1にならないので$b_{0,3}$~$b_{4,3}$の内、同時に有効な(0ではない)項は4個です。したがい、曲線形状の決定に関係する制御点は、$3\leq t<4$では$P_0$~$P_3$、$4\leq t<5$では$P_1$~$P_4$であり、2つの曲線(カーブセグメント)が連なった複合曲線と捉えることができます。

 g03a.png

そこで、制御点を2分割し、2回にわけて曲線を描画することができます。

制御点 tの値域 ノットベクトル
0 $ \begin{bmatrix} \boldsymbol{P}_0 & \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 \end{bmatrix} $ $3\leq t<4$ $ \begin{bmatrix} 0 & 1 & 2 & 3 & 4 & 5 & 6 & 7 \end{bmatrix} $
1 $ \begin{bmatrix} \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 & \boldsymbol{P}_4 \end{bmatrix} $ $4\leq t<5$ $ \begin{bmatrix} 1 & 2 & 3 & 4 & 5 & 6 & 7 & 8 \end{bmatrix} $

$t$の値域を揃えることで、同じノットベクトルを使いまわすことができます。

制御点 tの値域 ノットベクトル
0 $ \begin{bmatrix} \boldsymbol{P}_0 & \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 \end{bmatrix} $ $0\leq t<1$ $ \begin{bmatrix} -3 & -2 & -1 & 0 & 1 & 2 & 3 & 4 \end{bmatrix} $
1 $ \begin{bmatrix} \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 & \boldsymbol{P}_4 \end{bmatrix} $ $0\leq t<1$ $ \begin{bmatrix} -3 & -2 & -1 & 0 & 1 & 2 & 3 & 4 \end{bmatrix} $

閉じたB-スプライン曲線

制御点を循環して用いると、閉じた(closed)B-スプライン曲線を描画することができます。

制御点 tの値域 ノットベクトル
0 $ \begin{bmatrix} \boldsymbol{P}_0 & \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 \end{bmatrix} $ $0\leq t<1$ $ \begin{bmatrix} -3 & -2 & -1 & 0 & 1 & 2 & 3 & 4 \end{bmatrix} $
1 $ \begin{bmatrix} \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 & \boldsymbol{P}_0 \end{bmatrix} $ $0\leq t<1$ $ \begin{bmatrix} -3 & -2 & -1 & 0 & 1 & 2 & 3 & 4 \end{bmatrix} $
2 $ \begin{bmatrix} \boldsymbol{P}_2 & \boldsymbol{P}_3 & \boldsymbol{P}_0 & \boldsymbol{P}_1 \end{bmatrix} $ $0\leq t<1$ $ \begin{bmatrix} -3 & -2 & -1 & 0 & 1 & 2 & 3 & 4 \end{bmatrix} $
3 $ \begin{bmatrix} \boldsymbol{P}_3 & \boldsymbol{P}_0 & \boldsymbol{P}_1 & \boldsymbol{P}_2 \end{bmatrix} $ $0\leq t<1$ $ \begin{bmatrix} -3 & -2 & -1 & 0 & 1 & 2 & 3 & 4 \end{bmatrix} $

 gp9.png

クランプされたB-スプライン曲線

ノットベクトルの内、先頭および末尾の$n+1$個($n$は次数)が同じ値(multiple knots/重ね合わせ)だと、曲線の始点と終点が制御点に重なり、両端がクランプされた(clamped)B-スプライン曲線になります。
以下は $4 \leq m \leq 8$ のノットベクトルの例です。

$m$ ノットベクトル
4 $ \begin{bmatrix} 0 & 0 & 0 & 0 & 1 & 1 & 1 & 1 \end{bmatrix} $
5 $ \begin{bmatrix} 0 & 0 & 0 & 0 & 1 & 2 & 2 & 2 & 2 \end{bmatrix} $
6 $ \begin{bmatrix} 0 & 0 & 0 & 0 & 1 & 2 & 3 & 3 & 3 & 3 \end{bmatrix} $
7 $ \begin{bmatrix} 0 & 0 & 0 & 0 & 1 & 2 & 3 & 4 & 4 & 4 & 4 \end{bmatrix} $
8 $ \begin{bmatrix} 0 & 0 & 0 & 0 & 1 & 2 & 3 & 4 & 5 & 5 & 5 & 5 \end{bmatrix} $

制御点を分割し、$t$の値域を揃えると以下の通りになります。

$m$ 制御点 tの値域 ノットベクトル
4 $ \begin{bmatrix} \boldsymbol{P}_0 & \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 \end{bmatrix} $ $0\leq t<1$ $ \begin{bmatrix} 0 & 0 & 0 & 0 & 1 & 1 & 1 & 1 \end{bmatrix} $
5 $ \begin{bmatrix} \boldsymbol{P}_0 & \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 \end{bmatrix} $ $0\leq t<1$ $ \begin{bmatrix} 0 & 0 & 0 & 0 & 1 & 2 & 2 & 2 \end{bmatrix} $
$ \begin{bmatrix} \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 & \boldsymbol{P}_4 \end{bmatrix} $ $0\leq t<1$ $ \begin{bmatrix} -1 & -1 & -1 & 0 & 1 & 1 & 1 & 1 \end{bmatrix} $
6 $ \begin{bmatrix} \boldsymbol{P}_0 & \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 \end{bmatrix} $ $0\leq t<1$ $ \begin{bmatrix} 0 & 0 & 0 & 0 & 1 & 2 & 3 & 3 \end{bmatrix} $
$ \begin{bmatrix} \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 & \boldsymbol{P}_4 \end{bmatrix} $ $0\leq t<1$ $ \begin{bmatrix} -1 & -1 & -1 & 0 & 1 & 2 & 2 & 2 \end{bmatrix} $
$ \begin{bmatrix} \boldsymbol{P}_2 & \boldsymbol{P}_3 & \boldsymbol{P}_4 & \boldsymbol{P}_5 \end{bmatrix} $ $0\leq t<1$ $ \begin{bmatrix} -2 & -2 & -1 & 0 & 1 & 1 & 1 & 1 \end{bmatrix} $
7 $ \begin{bmatrix} \boldsymbol{P}_0 & \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 \end{bmatrix} $ $0\leq t<1$ $ \begin{bmatrix} 0 & 0 & 0 & 0 & 1 & 2 & 3 & 4 \end{bmatrix} $
$ \begin{bmatrix} \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 & \boldsymbol{P}_4 \end{bmatrix} $ $0\leq t<1$ $ \begin{bmatrix} -1 & -1 & -1 & 0 & 1 & 2 & 3 & 3 \end{bmatrix} $
$ \begin{bmatrix} \boldsymbol{P}_2 & \boldsymbol{P}_3 & \boldsymbol{P}_4 & \boldsymbol{P}_5 \end{bmatrix} $ $0\leq t<1$ $ \begin{bmatrix} -2 & -2 & -1 & 0 & 1 & 2 & 2 & 2 \end{bmatrix} $
$ \begin{bmatrix} \boldsymbol{P}_3 & \boldsymbol{P}_4 & \boldsymbol{P}_5 & \boldsymbol{P}_6 \end{bmatrix} $ $0\leq t<1$ $ \begin{bmatrix} -3 & -2 & -1 & 0 & 1 & 1 & 1 & 1 \end{bmatrix} $
8 $ \begin{bmatrix} \boldsymbol{P}_0 & \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 \end{bmatrix} $ $0\leq t<1$ $ \begin{bmatrix} 0 & 0 & 0 & 0 & 1 & 2 & 3 & 4 \end{bmatrix} $
$ \begin{bmatrix} \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 & \boldsymbol{P}_4 \end{bmatrix} $ $0\leq t<1$ $ \begin{bmatrix} -1 & -1 & -1 & 0 & 1 & 2 & 3 & 4 \end{bmatrix} $
$ \begin{bmatrix} \boldsymbol{P}_2 & \boldsymbol{P}_3 & \boldsymbol{P}_4 & \boldsymbol{P}_5 \end{bmatrix} $ $0\leq t<1$ $ \begin{bmatrix} -2 & -2 & -1 & 0 & 1 & 2 & 3 & 3 \end{bmatrix} $
$ \begin{bmatrix} \boldsymbol{P}_3 & \boldsymbol{P}_4 & \boldsymbol{P}_5 & \boldsymbol{P}_6 \end{bmatrix} $ $0\leq t<1$ $ \begin{bmatrix} -3 & -2 & -1 & 0 & 1 & 2 & 2 & 2 \end{bmatrix} $
$ \begin{bmatrix} \boldsymbol{P}_4 & \boldsymbol{P}_5 & \boldsymbol{P}_6 & \boldsymbol{P}_7 \end{bmatrix} $ $0\leq t<1$ $ \begin{bmatrix} -3 & -2 & -1 & 0 & 1 & 1 & 1 & 1 \end{bmatrix} $

各ノットベクトルに対する係数行列$\boldsymbol{R_{bsp}}$は以下の通りです。
$m=8$の$ \begin{bmatrix} \boldsymbol{P}_2 & \boldsymbol{P}_3 & \boldsymbol{P}_4 & \boldsymbol{P}_5 \end{bmatrix} $の係数行列は、一様B-スプライン曲線の係数行列と等しくなります。$m \ge 9$の場合は、この係数行列を必要なだけ繰り返します。

$m$ 制御点 $\boldsymbol{R_{bsp}}$
4 $ \begin{bmatrix} \boldsymbol{P}_0 & \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 \end{bmatrix} $ $ \begin{bmatrix} -1 && 3 && -3 && 1 \\ 3 && -6 && 3 && 0 \\ -3 && 3 && 0 && 0 \\ 1 && 0 && 0 && 0 \end{bmatrix} $
5 $ \begin{bmatrix} \boldsymbol{P}_0 & \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 \end{bmatrix} $ $ \begin{bmatrix} -1 && \frac{7}{4} && -1 && \frac{1}{4} \\ 3 && -\frac{9}{2} && \frac{3}{2} && 0 \\ -3 && 3 && 0 && 0 \\ 1 && 0 && 0 && 0 \end{bmatrix} $
$ \begin{bmatrix} \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 & \boldsymbol{P}_4 \end{bmatrix} $ $ \begin{bmatrix} -\frac{1}{4} && 1 && -\frac{7}{4} && 1 \\ \frac{3}{4} && -\frac{3}{2} && \frac{3}{4} && 0 \\ -\frac{3}{4} && 0 && \frac{3}{4} && 0 \\ \frac{1}{4} && \frac{1}{2} && \frac{1}{4} && 0 \end{bmatrix} $
6 $ \begin{bmatrix} \boldsymbol{P}_0 & \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 \end{bmatrix} $ $ \begin{bmatrix} -1 && \frac{7}{4} && -\frac{11}{12} && \frac{1}{6} \\ 3 && -\frac{9}{2} && \frac{3}{2} && 0 \\ -3 && 3 && 0 && 0 \\ 1 && 0 && 0 && 0 \end{bmatrix} $
$ \begin{bmatrix} \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 & \boldsymbol{P}_4 \end{bmatrix} $ $ \begin{bmatrix} -\frac{1}{4} && \frac{7}{12} && -\frac{7}{12} && \frac{1}{4} \\ \frac{3}{4} && -\frac{5}{4} && \frac{1}{2} && 0 \\ -\frac{3}{4} && \frac{1}{4} && \frac{1}{2} && 0 \\ \frac{1}{4} && \frac{7}{12} && \frac{1}{6} && 0 \end{bmatrix} $
$ \begin{bmatrix} \boldsymbol{P}_2 & \boldsymbol{P}_3 & \boldsymbol{P}_4 & \boldsymbol{P}_5 \end{bmatrix} $ $ \begin{bmatrix} -\frac{1}{6} && \frac{11}{12} && -\frac{7}{4} && 1 \\ \frac{1}{2} && -\frac{5}{4} && \frac{3}{4} && 0 \\ -\frac{1}{2} && -\frac{1}{4} && \frac{3}{4} && 0 \\ \frac{1}{6} && \frac{7}{12} && \frac{1}{4} && 0 \end{bmatrix} $
7 $ \begin{bmatrix} \boldsymbol{P}_0 & \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 \end{bmatrix} $ $ \begin{bmatrix} -1 && \frac{7}{4} && -\frac{11}{12} && \frac{1}{6} \\ 3 && -\frac{9}{2} && \frac{3}{2} && 0 \\ -3 && 3 && 0 && 0 \\ 1 && 0 && 0 && 0 \end{bmatrix} $
$ \begin{bmatrix} \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 & \boldsymbol{P}_4 \end{bmatrix} $ $ \begin{bmatrix} -\frac{1}{4} && \frac{7}{12} && -\frac{1}{2} && \frac{1}{6} \\ \frac{3}{4} && -\frac{5}{4} && \frac{1}{2} && 0 \\ -\frac{3}{4} && \frac{1}{4} && \frac{1}{2} && 0 \\ \frac{1}{4} && \frac{7}{12} && \frac{1}{6} && 0 \end{bmatrix} $
$ \begin{bmatrix} \boldsymbol{P}_2 & \boldsymbol{P}_3 & \boldsymbol{P}_4 & \boldsymbol{P}_5 \end{bmatrix} $ $ \begin{bmatrix} -\frac{1}{6} && \frac{1}{2} && -\frac{7}{12} && \frac{1}{4} \\ \frac{1}{2} && -1 && \frac{1}{2} && 0 \\ -\frac{1}{2} && 0 && \frac{1}{2} && 0 \\ \frac{1}{6} && \frac{2}{3} && \frac{1}{6} && 0 \end{bmatrix} $
$ \begin{bmatrix} \boldsymbol{P}_3 & \boldsymbol{P}_4 & \boldsymbol{P}_5 & \boldsymbol{P}_6 \end{bmatrix} $ $ \begin{bmatrix} -\frac{1}{6} && \frac{11}{12} && -\frac{7}{4} && 1 \\ \frac{1}{2} && -\frac{5}{4} && \frac{3}{4} && 0 \\ -\frac{1}{2} && -\frac{1}{4} && \frac{3}{4} && 0 \\ \frac{1}{6} && \frac{7}{12} && \frac{1}{4} && 0 \end{bmatrix} $
8 $ \begin{bmatrix} \boldsymbol{P}_0 & \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 \end{bmatrix} $ $ \begin{bmatrix} -1 && \frac{7}{4} && -\frac{11}{12} && \frac{1}{6} \\ 3 && -\frac{9}{2} && \frac{3}{2} && 0 \\ -3 && 3 && 0 && 0 \\ 1 && 0 && 0 && 0 \end{bmatrix} $
$ \begin{bmatrix} \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 & \boldsymbol{P}_4 \end{bmatrix} $ $ \begin{bmatrix} -\frac{1}{4} && \frac{7}{12} && -\frac{1}{2} && \frac{1}{6} \\ \frac{3}{4} && -\frac{5}{4} && \frac{1}{2} && 0 \\ -\frac{3}{4} && \frac{1}{4} && \frac{1}{2} && 0 \\ \frac{1}{4} && \frac{7}{12} && \frac{1}{6} && 0 \end{bmatrix} $
$ \begin{bmatrix} \boldsymbol{P}_2 & \boldsymbol{P}_3 & \boldsymbol{P}_4 & \boldsymbol{P}_5 \end{bmatrix} $ $ \begin{bmatrix} -\frac{1}{6} && \frac{1}{2} && -\frac{1}{2} && \frac{1}{6} \\ \frac{1}{2} && -1 && \frac{1}{2} && 0 \\ -\frac{1}{2} && 0 && \frac{1}{2} && 0 \\ \frac{1}{6} && \frac{2}{3} && \frac{1}{6} && 0 \end{bmatrix} $ $m \ge 9$の場合、
必要なだけ反復
$ \begin{bmatrix} \boldsymbol{P}_3 & \boldsymbol{P}_4 & \boldsymbol{P}_5 & \boldsymbol{P}_6 \end{bmatrix} $ $ \begin{bmatrix} -\frac{1}{6} && \frac{1}{2} && -\frac{7}{12} && \frac{1}{4} \\ \frac{1}{2} && -1 && \frac{1}{2} && 0 \\ -\frac{1}{2} && 0 && \frac{1}{2} && 0 \\ \frac{1}{6} && \frac{2}{3} && \frac{1}{6} && 0 \end{bmatrix} $
$ \begin{bmatrix} \boldsymbol{P}_4 & \boldsymbol{P}_5 & \boldsymbol{P}_6 & \boldsymbol{P}_7 \end{bmatrix} $ $ \begin{bmatrix} -\frac{1}{6} && \frac{11}{12} && -\frac{7}{4} && 1 \\ \frac{1}{2} && -\frac{5}{4} && \frac{3}{4} && 0 \\ -\frac{1}{2} && -\frac{1}{4} && \frac{3}{4} && 0 \\ \frac{1}{6} && \frac{7}{12} && \frac{1}{4} && 0 \end{bmatrix} $

以下は$m=5$のクランプされたB-スプライン曲線の例です。
 gp0clamped.png

B-スプライン曲線をベジェ曲線に変換する

ベジェ曲線の行列形式は以下の通りです。

\boldsymbol{B}(t)=
\begin{bmatrix}
t^3 & t^2 & t & 1
\end{bmatrix}
\boldsymbol{R_{bz}}
\begin{bmatrix}
{\boldsymbol{P_{bz}}}_0 \\
{\boldsymbol{P_{bz}}}_1 \\
{\boldsymbol{P_{bz}}}_2 \\
{\boldsymbol{P_{bz}}}_3
\end{bmatrix}
\boldsymbol{R_{bz}}=
\begin{bmatrix}
-1 & 3 & -3 & 1 \\
3 & -6 & 3 & 0 \\
-3 & 3 & 0 & 0 \\
1 & 0 & 0 & 0
\end{bmatrix}

B-スプライン曲線と等しくなるベジェ曲線の制御点を求めることができます。

\boldsymbol{B}(t)=
\boldsymbol{S}(t)

なので

\boldsymbol{R_{bz}}
\begin{bmatrix}
{\boldsymbol{P_{bz}}}_0 \\
{\boldsymbol{P_{bz}}}_1 \\
{\boldsymbol{P_{bz}}}_2 \\
{\boldsymbol{P_{bz}}}_3
\end{bmatrix}
=
\boldsymbol{R_{bsp}}
\begin{bmatrix}
{\boldsymbol{P}}_0 \\
{\boldsymbol{P}}_1 \\
{\boldsymbol{P}}_2 \\
{\boldsymbol{P}}_3
\end{bmatrix}

です。
両辺に左側から$\boldsymbol{R_{bz}}^{-1}$をかけると

\begin{bmatrix}
{\boldsymbol{P_{bz}}}_0 \\
{\boldsymbol{P_{bz}}}_1 \\
{\boldsymbol{P_{bz}}}_2 \\
{\boldsymbol{P_{bz}}}_3
\end{bmatrix}
=
\boldsymbol{R_{bz}}^{-1}
\boldsymbol{R_{bsp}}
\begin{bmatrix}
{\boldsymbol{P_{bsp}}}_0 \\
{\boldsymbol{P_{bsp}}}_1 \\
{\boldsymbol{P_{bsp}}}_2 \\
{\boldsymbol{P_{bsp}}}_3
\end{bmatrix}

となります。$\boldsymbol{R_{bsp}}$に一様B-スプライン曲線の係数行列の値をあてはめて計算すると

\boldsymbol{R_{bz}}^{-1}
\boldsymbol{R_{bsp}}=
\frac{1}{6}
\begin{bmatrix}
1 & 4 & 1 & 0 \\
0 & 4 & 2 & 0 \\
0 & 2 & 4 & 0 \\
0 & 1 & 4 & 1
\end{bmatrix}

になります。これが変換行列です。
以下は制御点を変換した例です。青色がB-スプライン曲線用の制御点、赤色がそれを変換したベジェ曲線用の制御点です。
 gp4b.png gp9b.png

クランプされたB-スプライン曲線の変換行列は以下の通りです。
$m=4$のクランプされたB-スプライン曲線はベジェ曲線と等価であるため、変換行列が単位行列になります。

$m$ 制御点 変換行列
4 $ \begin{bmatrix} \boldsymbol{P}_0 & \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 \end{bmatrix} $ $ \begin{bmatrix} 1 && 0 && 0 && 0 \\ 0 && 1 && 0 && 0 \\ 0 && 0 && 1 && 0 \\ 0 && 0 && 0 && 1 \end{bmatrix} $
5 $ \begin{bmatrix} \boldsymbol{P}_0 & \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 \end{bmatrix} $ $ \begin{bmatrix} 1 && 0 && 0 && 0 \\ 0 && 1 && 0 && 0 \\ 0 && \frac{1}{2} && \frac{1}{2} && 0 \\ 0 && \frac{1}{4} && \frac{1}{2} && \frac{1}{4} \end{bmatrix} $
$ \begin{bmatrix} \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 & \boldsymbol{P}_4 \end{bmatrix} $ $ \begin{bmatrix} \frac{1}{4} && \frac{1}{2} && \frac{1}{4} && 0 \\ 0 && \frac{1}{2} && \frac{1}{2} && 0 \\ 0 && 0 && 1 && 0 \\ 0 && 0 && 0 && 1 \end{bmatrix} $
6 $ \begin{bmatrix} \boldsymbol{P}_0 & \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 \end{bmatrix} $ $ \begin{bmatrix} 1 && 0 && 0 && 0 \\ 0 && 1 && 0 && 0 \\ 0 && \frac{1}{2} && \frac{1}{2} && 0 \\ 0 && \frac{1}{4} && \frac{7}{12} && \frac{1}{6} \end{bmatrix} $
$ \begin{bmatrix} \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 & \boldsymbol{P}_4 \end{bmatrix} $ $ \begin{bmatrix} \frac{1}{4} && \frac{7}{12} && \frac{1}{6} && 0 \\ 0 && \frac{2}{3} && \frac{1}{3} && 0 \\ 0 && \frac{1}{3} && \frac{2}{3} && 0 \\ 0 && \frac{1}{6} && \frac{7}{12} && \frac{1}{4} \end{bmatrix} $
$ \begin{bmatrix} \boldsymbol{P}_2 & \boldsymbol{P}_3 & \boldsymbol{P}_4 & \boldsymbol{P}_5 \end{bmatrix} $ $ \begin{bmatrix} \frac{1}{6} && \frac{7}{12} && \frac{1}{4} && 0 \\ 0 && \frac{1}{2} && \frac{1}{2} && 0 \\ 0 && 0 && 1 && 0 \\ 0 && 0 && 0 && 1 \end{bmatrix} $
7 $ \begin{bmatrix} \boldsymbol{P}_0 & \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 \end{bmatrix} $ $ \begin{bmatrix} 1 && 0 && 0 && 0 \\ 0 && 1 && 0 && 0 \\ 0 && \frac{1}{2} && \frac{1}{2} && 0 \\ 0 && \frac{1}{4} && \frac{7}{12} && \frac{1}{6} \end{bmatrix} $
$ \begin{bmatrix} \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 & \boldsymbol{P}_4 \end{bmatrix} $ $ \begin{bmatrix} \frac{1}{4} && \frac{7}{12} && \frac{1}{6} && 0 \\ 0 && \frac{2}{3} && \frac{1}{3} && 0 \\ 0 && \frac{1}{3} && \frac{2}{3} && 0 \\ 0 && \frac{1}{6} && \frac{2}{3} && \frac{1}{6} \end{bmatrix} $
$ \begin{bmatrix} \boldsymbol{P}_2 & \boldsymbol{P}_3 & \boldsymbol{P}_4 & \boldsymbol{P}_5 \end{bmatrix} $ $ \begin{bmatrix} \frac{1}{6} && \frac{2}{3} && \frac{1}{6} && 0 \\ 0 && \frac{2}{3} && \frac{1}{3} && 0 \\ 0 && \frac{1}{3} && \frac{2}{3} && 0 \\ 0 && \frac{1}{6} && \frac{7}{12} && \frac{1}{4} \end{bmatrix} $
$ \begin{bmatrix} \boldsymbol{P}_3 & \boldsymbol{P}_4 & \boldsymbol{P}_5 & \boldsymbol{P}_6 \end{bmatrix} $ $ \begin{bmatrix} \frac{1}{6} && \frac{7}{12} && \frac{1}{4} && 0 \\ 0 && \frac{1}{2} && \frac{1}{2} && 0 \\ 0 && 0 && 1 && 0 \\ 0 && 0 && 0 && 1 \end{bmatrix} $
8 $ \begin{bmatrix} \boldsymbol{P}_0 & \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 \end{bmatrix} $ $ \begin{bmatrix} 1 && 0 && 0 && 0 \\ 0 && 1 && 0 && 0 \\ 0 && \frac{1}{2} && \frac{1}{2} && 0 \\ 0 && \frac{1}{4} && \frac{7}{12} && \frac{1}{6} \end{bmatrix} $
$ \begin{bmatrix} \boldsymbol{P}_1 & \boldsymbol{P}_2 & \boldsymbol{P}_3 & \boldsymbol{P}_4 \end{bmatrix} $ $ \begin{bmatrix} \frac{1}{4} && \frac{7}{12} && \frac{1}{6} && 0 \\ 0 && \frac{2}{3} && \frac{1}{3} && 0 \\ 0 && \frac{1}{3} && \frac{2}{3} && 0 \\ 0 && \frac{1}{6} && \frac{2}{3} && \frac{1}{6} \end{bmatrix} $
$ \begin{bmatrix} \boldsymbol{P}_2 & \boldsymbol{P}_3 & \boldsymbol{P}_4 & \boldsymbol{P}_5 \end{bmatrix} $ $ \begin{bmatrix} \frac{1}{6} && \frac{2}{3} && \frac{1}{6} && 0 \\ 0 && \frac{2}{3} && \frac{1}{3} && 0 \\ 0 && \frac{1}{3} && \frac{2}{3} && 0 \\ 0 && \frac{1}{6} && \frac{2}{3} && \frac{1}{6} \end{bmatrix} $ $m \ge 9$の場合、
必要なだけ反復
$ \begin{bmatrix} \boldsymbol{P}_3 & \boldsymbol{P}_4 & \boldsymbol{P}_5 & \boldsymbol{P}_6 \end{bmatrix} $ $ \begin{bmatrix} \frac{1}{6} && \frac{2}{3} && \frac{1}{6} && 0 \\ 0 && \frac{2}{3} && \frac{1}{3} && 0 \\ 0 && \frac{1}{3} && \frac{2}{3} && 0 \\ 0 && \frac{1}{6} && \frac{7}{12} && \frac{1}{4} \end{bmatrix} $
$ \begin{bmatrix} \boldsymbol{P}_4 & \boldsymbol{P}_5 & \boldsymbol{P}_6 & \boldsymbol{P}_7 \end{bmatrix} $ $ \begin{bmatrix} \frac{1}{6} && \frac{7}{12} && \frac{1}{4} && 0 \\ 0 && \frac{1}{2} && \frac{1}{2} && 0 \\ 0 && 0 && 1 && 0 \\ 0 && 0 && 0 && 1 \end{bmatrix} $

B-スプライン曲線描画の実装例

以下はB-スプライン曲線をベジェ曲線に変換して、描画APIのベジェ曲線描画機能を用いて描画するQtアプリの一部抜粋です。
cpsに制御点の座標、mに制御点の数、bClosedとbClampedにB-スプライン曲線の種類を格納してdrawBsp()を呼ぶと、sceneにB-スプライン曲線が描画されます。

mainwindow.h
	QGraphicsScene scene;
	QPainterPath pp;
	QList<QPointF> cps;	// 制御点
	int m;				// 制御点数
	bool bClosed;
	bool bClamped;
	void drawBsp();
    void drawBspSegment(int i);
    void drawClampedBspSegment(int i);
mainwindow.cpp
// B-スプライン曲線を描画する
void MainWindow::drawBsp()
{
	if(pCurve){
		scene.removeItem(pCurve);
        delete pCurve;
		pCurve = nullptr;
	}
	pp.clear();
	if(bClamped){
        switch(m){
        case 4:
            drawClampedBspSegment(0);
            break;
        case 5:
            drawClampedBspSegment(0);
            drawClampedBspSegment(1);
            break;
        case 6:
            drawClampedBspSegment(0);
            drawClampedBspSegment(1);
            drawClampedBspSegment(2);
            break;
        default:
            drawClampedBspSegment(0);
            drawClampedBspSegment(1);
            for(int i = 2; i <= m - 6; i++)
                drawBspSegment(i);
            drawClampedBspSegment(m - 5);
            drawClampedBspSegment(m - 4);
            break;
        }
	}else{
        for(int i = 0; i <= m - 4; i++)
            drawBspSegment(i);
		if(bClosed){
            drawBspSegment(m - 3);
            drawBspSegment(m - 2);
            drawBspSegment(m - 1);
		}
	}
	pCurve = scene.addPath(pp);
}

// B-スプライン曲線の1セグメントを描画する
void MainWindow::drawBspSegment(int i)
{
    QPointF p1 = cps[(i + 1) % m];
    QPointF p2 = cps[(i + 2) % m];
    QPointF p3 = cps[(i + 3) % m];
    QPointF bzp1 = (2 * p1 + p2) / 3;
    QPointF bzp2 = (p1 + 2 * p2) / 3;
    QPointF bzp3 = (p1 + 4 * p2 + p3) / 6;
    if(i == 0){
        QPointF p0 = cps[i];
        QPointF bzp0 = (p0 + 4 * p1 + p2) / 6;
		pp.moveTo(bzp0);
	}
	pp.cubicTo(bzp1, bzp2, bzp3);
}

// Clamped B-スプライン曲線の1セグメントを描画する
void MainWindow::drawClampedBspSegment(int i)
{
    QPointF p1 = cps[i + 1];
    QPointF p2 = cps[i + 2];
    QPointF p3 = cps[i + 3];
    QPointF bzp1, bzp2, bzp3;
    switch(m){
    case 4:
        bzp1 = p1;
        bzp2 = p2;
        bzp3 = p3;
        break;
    case 5:
        if(i == 0){
            bzp1 = p1;
            bzp2 = (p1 + p2) / 2;
            bzp3 = (p1 + 2 * p2 + p3) / 4;
        }else{
            bzp1 = (p1 + p2) / 2;
            bzp2 = p2;
            bzp3 = p3;
        }
        break;
    case 6:
        if(i == 0){
            bzp1 = p1;
            bzp2 = (p1 + p2) / 2;
            bzp3 = (3 * p1 + 7 * p2 + 2 * p3) / 12;
        }else if(i == 1){
            bzp1 = (2 * p1 + p2) / 3;
            bzp2 = (p1 + 2 * p2) / 3;
            bzp3 = (2 * p1 + 7 * p2 + 3 * p3) / 12;
        }else{
            bzp1 = (p1 + p2) / 2;
            bzp2 = p2;
            bzp3 = p3;
        }
        break;
    default:
        if(i == 0){
            bzp1 = p1;
            bzp2 = (p1 + p2) / 2;
            bzp3 = (3 * p1 + 7 * p2 + 2 * p3) / 12;
        }else if(i == 1){
            bzp1 = (2 * p1 + p2) / 3;
            bzp2 = (p1 + 2 * p2) / 3;
            bzp3 = (p1 + 4 * p2 + p3) / 6;
        }else if(i == m - 5){
            bzp1 = (2 * p1 + p2) / 3;
            bzp2 = (p1 + 2 * p2) / 3;
            bzp3 = (2 * p1 + 7 * p2 + 3 * p3) / 12;
        }else{
            bzp1 = (p1 + p2) / 2;
            bzp2 = p2;
            bzp3 = p3;
            break;
        }
        break;
	}
    if(i == 0)
        pp.moveTo(cps[i]);
    pp.cubicTo(bzp1, bzp2, bzp3);
}

画面・実行例
bsp1c.png

B-スプライン曲線の連続性

ここで取り上げている3次B-スプライン曲線のカーブセグメントは$t$の3次関数なので、カーブセグメントは2回微分可能でありC2連続です。

カーブセグメント間の連続性は以下の方法でC2連続であることがわかります。
$i$番目と$i+1$番目のカーブセグメントをそれぞれ

\begin{array}{l}
\boldsymbol{S}_i(t) =
\begin{bmatrix} t^3 & t^2 & t & 1 \end{bmatrix}
{\boldsymbol{R}}_i {\boldsymbol{P}}_i =
\begin{bmatrix} b_{i_{0,3}}(t) & b_{i_{1,3}}(t) &b_{i_{2,3}}(t) &b_{i_{3,3}}(t) \end{bmatrix}
{\boldsymbol{P}}_i \\
\boldsymbol{S}_{i+1}(t) =
\begin{bmatrix} t^3 & t^2 & t & 1 \end{bmatrix}
{\boldsymbol{R}}_{i+1} {\boldsymbol{P}}_{i+1} =
\begin{bmatrix} b_{{i+1}_{0,3}}(t) & b_{{i+1}_{1,3}}(t) &b_{{i+1}_{2,3}}(t) &b_{{i+1}_{3,3}}(t) \end{bmatrix}
{\boldsymbol{P}}_{i+1} \\
{\boldsymbol{P}}_i =
\begin{bmatrix}
{\boldsymbol{p}}_i \\
{\boldsymbol{p}}_{i+1} \\
{\boldsymbol{p}}_{i+2} \\
{\boldsymbol{p}}_{i+3}
\end{bmatrix}
\quad
{\boldsymbol{P}}_{i+1} =
\begin{bmatrix}
{\boldsymbol{p}}_{i+1} \\
{\boldsymbol{p}}_{i+2} \\
{\boldsymbol{p}}_{i+3} \\
{\boldsymbol{p}}_{i+4}
\end{bmatrix}
\end{array}

とすると、

\begin{array}{l}
b_{i_{0,3}}(1)=0 \\
b_{i_{1,3}}(1)=b_{{i+1}_{0,3}}(0) \\
b_{i_{2,3}}(1)=b_{{i+1}_{1,3}}(0) \\
b_{i_{3,3}}(1)=b_{{i+1}_{2,3}}(0) \\
b_{{i+1}_{3,3}}(0)=0
\end{array}

であれば

\boldsymbol{S}_i(1)=\boldsymbol{S}_{i+1}(0)

なので、C0連続を判定できます。

一様B-スプライン曲線の場合、係数行列は、

{\boldsymbol{R}}_i={\boldsymbol{R}}_{i+1}=
\begin{bmatrix}
-\frac{1}{6} & \frac{1}{2} & -\frac{1}{2} & \frac{1}{6} \\
\frac{1}{2} & -1 & \frac{1}{2} & 0 \\
-\frac{1}{2} & 0 & \frac{1}{2} & 0 \\
\frac{1}{6} & \frac{2}{3} & \frac{1}{6} & 0
\end{bmatrix}

なので

\begin{array}{l}
\begin{bmatrix} b_{i_{0,3}}(1) & b_{i_{1,3}}(1) &b_{i_{2,3}}(1) &b_{i_{3,3}}(1) \end{bmatrix}
= 
\frac{1}{6}\begin{bmatrix} 0 & 1 & 4 & 1 \end{bmatrix} \\
\begin{bmatrix} b_{{i+1}_{0,3}}(0) & b_{{i+1}_{1,3}}(0) &b_{{i+1}_{2,3}}(0) &b_{{i+1}_{3,3}}(0) \end{bmatrix}
=
\frac{1}{6}\begin{bmatrix} 1 & 4 & 1 & 0 \end{bmatrix}\end{array}

であり、C0連続を判定できます。
C1やC2の連続性は、基底関数の1次微分や2次微分から同様に判定できます。

\begin{array}{l}
\begin{bmatrix} b'_{i_{0,3}}(1) & b'_{i_{1,3}}(1) &b'_{i_{2,3}}(1) &b'_{i_{3,3}}(1) \end{bmatrix}
=
\frac{1}{2}\begin{bmatrix} 0 & -1 & 0 & 1 \end{bmatrix} \\
\begin{bmatrix} b'_{{i+1}_{0,3}}(0) & b'_{{i+1}_{1,3}}(0) &b'_{{i+1}_{2,3}}(0) &b'_{{i+1}_{3,3}}(0) \end{bmatrix}
= 
\frac{1}{2}\begin{bmatrix} -1 & 0 & 1 & 0 \end{bmatrix}\end{array}

なので、C1連続を判定できます。

\begin{array}{l}
\begin{bmatrix} b''_{i_{0,3}}(1) & b''_{i_{1,3}}(1) &b''_{i_{2,3}}(1) &b''_{i_{3,3}}(1) \end{bmatrix}
= 
\begin{bmatrix} 0 & 1 & -2 & 1 \end{bmatrix} \\
\begin{bmatrix} b''_{{i+1}_{0,3}}(0) & b''_{{i+1}_{1,3}}(0) &b''_{{i+1}_{2,3}}(0) &b''_{{i+1}_{3,3}}(0) \end{bmatrix}
=
\begin{bmatrix} 1 & -2 & 1 & 0 \end{bmatrix}\end{array}

なので、C2連続を判定できます。

クランプされたB-スプライン曲線は係数行列が多いので表にします。
以下の表により、C0連続を判定できます。

$m$ カーブ
セグメント
$t$ $b_{0,3}(0)$ $b_{1,3}(0)$ $b_{2,3}(0)$ $b_{3,3}(0)$ 判定
$b_{0,3}(1)$ $b_{1,3}(1)$ $b_{2,3}(1)$ $b_{3,3}(1)$
$5$ $0$ $0$ $1$ $0$ $0$ $0$
$1$ $0$ $\frac{1}{4}$ $\frac{1}{2}$ $\frac{1}{4}$ $true$
$1$ $0$ $\frac{1}{4}$ $\frac{1}{2}$ $\frac{1}{4}$ $0$
$1$ $0$ $0$ $0$ $1$
$6$ $0$ $0$ $1$ $0$ $0$ $0$
$1$ $0$ $\frac{1}{4}$ $\frac{7}{12}$ $\frac{1}{6}$ $true$
$1$ $0$ $\frac{1}{4}$ $\frac{7}{12}$ $\frac{1}{6}$ $0$
$1$ $0$ $\frac{1}{6}$ $\frac{7}{12}$ $\frac{1}{4}$ $true$
$2$ $0$ $\frac{1}{6}$ $\frac{7}{12}$ $\frac{1}{4}$ $0$
$1$ $0$ $0$ $0$ $1$
$\ge 7$ $0$ $0$ $1$ $0$ $0$ $0$
$1$ $0$ $\frac{1}{4}$ $\frac{7}{12}$ $\frac{1}{6}$ $true$
$1$ $0$ $\frac{1}{4}$ $\frac{7}{12}$ $\frac{1}{6}$ $0$
$1$ $0$ $\frac{1}{6}$ $\frac{2}{3}$ $\frac{1}{6}$ $true$
$2$~$m-6$ $0$ $\frac{1}{6}$ $\frac{2}{3}$ $\frac{1}{6}$ $0$
$1$ $0$ $\frac{1}{6}$ $\frac{2}{3}$ $\frac{1}{6}$ $true$
$m-5$ $0$ $\frac{1}{6}$ $\frac{2}{3}$ $\frac{1}{6}$ $0$
$1$ $0$ $\frac{1}{6}$ $\frac{7}{12}$ $\frac{1}{4}$ $true$
$m-4$ $0$ $\frac{1}{6}$ $\frac{7}{12}$ $\frac{1}{4}$ $0$
$1$ $0$ $0$ $0$ $1$

以下の表により、C1連続を判定できます。

$m$ カーブ
セグメント
$t$ $b'_{0,3}(0)$ $b'_{1,3}(0)$ $b'_{2,3}(0)$ $b'_{3,3}(0)$ 判定
$b'_{0,3}(1)$ $b'_{1,3}(1)$ $b'_{2,3}(1)$ $b'_{3,3}(1)$
$5$ $0$ $0$ $-3$ $3$ $0$ $0$
$1$ $0$ $-\frac{3}{4}$ $0$ $\frac{3}{4}$ $true$
$1$ $0$ $-\frac{3}{4}$ $0$ $\frac{3}{4}$ $0$
$1$ $0$ $0$ $-3$ $3$
$6$ $0$ $0$ $-3$ $3$ $0$ $0$
$1$ $0$ $-\frac{3}{4}$ $\frac{1}{4}$ $\frac{1}{2}$ $true$
$1$ $0$ $-\frac{3}{4}$ $\frac{1}{4}$ $\frac{1}{2}$ $0$
$1$ $0$ $-\frac{1}{2}$ $-\frac{1}{4}$ $\frac{3}{4}$ $true$
$2$ $0$ $-\frac{1}{2}$ $-\frac{1}{4}$ $\frac{3}{4}$ $0$
$1$ $0$ $0$ $-3$ $3$
$\ge 7$ $0$ $0$ $-3$ $3$ $0$ $0$
$1$ $0$ $-\frac{3}{4}$ $\frac{1}{4}$ $\frac{1}{2}$ $true$
$1$ $0$ $-\frac{3}{4}$ $\frac{1}{4}$ $\frac{1}{2}$ $0$
$1$ $0$ $-\frac{1}{2}$ $0$ $\frac{1}{2}$ $true$
$2$~$m-6$ $0$ $-\frac{1}{2}$ $0$ $\frac{1}{2}$ $0$
$1$ $0$ $-\frac{1}{2}$ $0$ $\frac{1}{2}$ $true$
$m-5$ $0$ $-\frac{1}{2}$ $0$ $\frac{1}{2}$ $0$
$1$ $0$ $-\frac{1}{2}$ $-\frac{1}{4}$ $\frac{3}{4}$ $true$
$m-4$ $0$ $-\frac{1}{2}$ $-\frac{1}{4}$ $\frac{3}{4}$ $0$
$1$ $0$ $0$ $-3$ $3$

以下の表により、C2連続を判定できます。

$m$ カーブ
セグメント
$t$ $b''_{0,3}(0)$ $b''_{1,3}(0)$ $b''_{2,3}(0)$ $b''_{3,3}(0)$ 判定
$b''_{0,3}(1)$ $b''_{1,3}(1)$ $b''_{2,3}(1)$ $b''_{3,3}(1)$
$5$ $0$ $0$ $6$ $-9$ $3$ $0$
$1$ $0$ $\frac{3}{2}$ $-3$ $\frac{3}{2}$ $true$
$1$ $0$ $\frac{3}{2}$ $-3$ $\frac{3}{2}$ $0$
$1$ $0$ $3$ $-9$ $6$
$6$ $0$ $0$ $6$ $-9$ $3$ $0$
$1$ $0$ $\frac{3}{2}$ $-\frac{5}{2}$ $1$ $true$
$1$ $0$ $\frac{3}{2}$ $-\frac{5}{2}$ $1$ $0$
$1$ $0$ $1$ $-\frac{5}{2}$ $\frac{3}{2}$ $true$
$2$ $0$ $1$ $-\frac{5}{2}$ $\frac{3}{2}$ $0$
$1$ $0$ $3$ $-9$ $6$
$\ge 7$ $0$ $0$ $6$ $-9$ $3$ $0$
$1$ $0$ $\frac{3}{2}$ $-\frac{5}{2}$ $1$ $true$
$1$ $0$ $\frac{3}{2}$ $-\frac{5}{2}$ $1$ $0$
$1$ $0$ $1$ $-2$ $1$ $true$
$2$~$m-6$ $0$ $1$ $-2$ $1$ $0$
$1$ $0$ $1$ $-2$ $1$ $true$
$m-5$ $0$ $1$ $-2$ $1$ $0$
$1$ $0$ $1$ $-\frac{5}{2}$ $\frac{3}{2}$ $true$
$m-4$ $0$ $1$ $-\frac{5}{2}$ $\frac{3}{2}$ $0$
$1$ $0$ $3$ $-9$ $6$

参考文献

  1. B-spline Curves: Definition
    https://pages.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/B-spline/bspline-curve.html

  2. Carl de Boor
    A Practical Guide to Splines, P.132
    ISBN 0-387-90356-9

  3. Elaine Cohen, Richard F. Riesenfeld
    General Matrix Representations for Bezier and B-spline Curves
    Computers in Industry 3 (1982) 9-15
    https://www.sciencedirect.com/science/article/abs/pii/0166361582900276

  4. Gerald Farin
    Curves and Surfaces for Computer Aided Geometric Design: A Practical Guide, pp.77-90
    ISBN 0-12-249050-9

  5. Wikipedia -- B-スプライン曲線
    https://ja.wikipedia.org/wiki/B-%E3%82%B9%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3%E6%9B%B2%E7%B7%9A

  6. Wikipedia -- 滑らかな関数
    https://ja.wikipedia.org/wiki/%E6%BB%91%E3%82%89%E3%81%8B%E3%81%AA%E9%96%A2%E6%95%B0

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?