B-スプライン曲線

B-スプライン曲線とは

B-スプライン曲線は、パラメトリック曲線の一種。

2次のB-スプライン曲線

2次のB-スプライン曲線は、3個の点によって定められる曲線で、TrueType フォントの記述に使われている。ちなみに、2次のB-スプライン曲線と2次の Bézier 曲線は全く同一のもの*1

090109_bspline.png

描き方

スプラインを決める3点を p0, p1, p2 とする。

  1. 線分 p0p1 を t : (1-t) に分割する点を q0(t) とする。
  2. 線分 p1p2 を t : (1-t) に分割する点を q1(t) とする。
  3. 線分 q0(t) q1(t) を t : (1-t) に分割する点が、スプライン上の点 p(t) となる。

0 ≤ t ≤ 1 の範囲で p(t) をプロットすれば、p0 と p1 を結ぶスプラインが得られる。

上の図は、t = 1/3 のときに p(t) の求め方を示したもの。○ : ● = 1/3 : (1 - 1/3) = 1 : 2 となっている。ピンク色の線が、3点 p0, p1, p2 によって定まるスプライン。

スプラインを表す式

スプライン上の点 p(t) は、次のように表される。

\mathbf{p}(t) = (1-t)^2\mathbf{p}_0 + 2t(1-t)\mathbf{p}_1 + t^2\mathbf{p}_2

証:描き方 1, 2 から、q0(t), q1(t) は

\mathbf{q}_0(t) = (1-t)\mathbf{p}_0 + t\mathbf{p}_1 \\\mathbf{q}_1(t) = (1-t)\mathbf{p}_1 + t\mathbf{p}_2

よって、描き方 3 から p(t) は

\begin{eqnarray}\mathbf{p}(t) & = & (1-t)\mathbf{q}_0(t) + t\mathbf{q}_1(t) \\              & = & (1-t) \{ (1-t)\mathbf{p}_0 + t\mathbf{p}_1 \}                   \,+\, t\{ (1-t)\mathbf{p}_1 + t\mathbf{p}_2 \} \\              & = & (1-t)^2\mathbf{p}_0                   + 2t(1-t)\mathbf{p}_1                   + t^2\mathbf{p}_2\end{eqnarray}

となる。また t = 0, 1 では

\mathbf{p}(0) = \mathbf{p}_0 \,, \qquad \mathbf{p(1)} = \mathbf{p}_2

となるので、p0 が始点 p(0) と一致し、p2 が終点 p(1) と一致する。もう一つの点 p1 は、曲がり具合を決める制御点となる。

傾き・接線

スプライン上の点 p(t) における傾き(接線の方向)は、次のようになる。

\mathbf{\dot{p} }(t) = 2\{-(1-t)\mathbf{p}_0 + (1-2t) \mathbf{p}_1 + t\mathbf{p}_2\}

よって t = 0, 0.5, 1 では

\mathbf{\dot p}(0)   =  2 (\mathbf{p}_1 - \mathbf{p}_0) \,, \qquad   \mathbf{\dot p}(0.5) =     \mathbf{p}_2 - \mathbf{p}_0  \,, \qquad    \mathbf{\dot p}(1)   =  2 (\mathbf{p}_2 - \mathbf{p}_1)

となる。

ちなみに、線分 q0q1 は

\begin{eqnarray}  \mathbf{q}_1(t) - \mathbf{q}_0(t) & = &        \{ (1-t)\mathbf{p}_1 + t\mathbf{p}_2 \}        \,-\, \{ (1-t)\mathbf{p}_0 + t\mathbf{p}_1 \} \\  & = & -(1-t)\mathbf{p}_0 + (1-2t) \mathbf{p}_1 + t\mathbf{p}_2 \\  & = & \frac{1}{2} \, \mathbf{\dot{p} }(t)\end{eqnarray}

となるので、点 p(t) の傾きと平行。また、点 p(t) は q0q1 上であるから、q0q1 は点 p(t) におけるスプラインの接線となる。

直線との交点

直線の式 ax+by+c=0 に

(x, \, y) = \mathbf{p}(t) =(p_x(t), \, p_y(t))

を代入すれば、

ap_x(t) +bp_y(t)+c=0

となり、t の2次方程式となる。これを解いて t の値を求めれば、そこから交点を計算することができる。

スプラインの分割

外部リンク

読み: べーたすぷらいんきょくせん

Tag: truetype 書きかけ

*1
一般には、n次のB-スプライン曲線とn次の Bézier 曲線は一致しない。