ベジェ曲線についての理論的なまとめ.
概要
ベジェ曲線について, 以下の内容を記載する.
- ベジェ曲線の公式の導出
- ベジェ曲線の性質(通る点, 傾き, 凸包)
- 円弧を近似する場合のパラメータの導出
ベジェ曲線の定義
ベジエ曲線とは, n 個の制御点から得られる n-1 次曲線である.
具体的には隣り合う制御点を t:1-t\ (0\le t\le 1) で逐次内分してゆくことにより得られる曲線である.
具体例
0次のベジェ曲線
(ここでは制御点が1つの場合, 便宜的に0次のベジェ曲線とする.)
制御点を z_0 とする(以下 z_i は2次元ベクトルとする).
0次のベジェ曲線 p_0^0(t) は,
1次のベジェ曲線
制御点を z_0, z_1 とする.
1次のベジェ曲線 p_0^1(t) は, z_0 と z_1 を結ぶ直線になる.
\begin{aligned}
p_0^1(t)
&= (1-t) p_0^0(t) + t p_1^0(t) \\
&= (1-t) z_0 + t z_1 \\
\end{aligned}
2次のベジェ曲線
制御点を z_0, z_1, z_2 とする.
2次のベジェ曲線 p_0^2(t) は, 以下の手順により求まる.
- 1次のベジェ曲線を求める
- 線分 z_0 z_1 を t:1-t に内分する点 p_0^1(t) を求める
- 線分 z_1 z_2 を t:1-t に内分する点 p_1^1(t) を求める
- 線分 p_0^1(t) p_1^1(t) を t:1-t に内分する点 p_0^2(t) を求める
以上をまとめると以下のようになる.
\begin{aligned}
p_0^2(t)
&= (1-t) p_0^1(t) + t p_1^1(t) \\
&= (1-t) \{ (1-t) p_0^0(t) + t p_1^0(t) \}
+ t \{ (1-t) p_1^0(t) + t p_2^0(t) \} \\
&= (1-t)^2 p_0^0(t) + 2(1-t)t p_1^0(t) + t^2 p_2^0(t) \\
&= (1-t)^2 z_0 + 2(1-t)t z_1 + t^2 z_2 \\
\end{aligned}
3次のベジェ曲線
制御点を z_0, z_1, z_2, z_3 とする.
3次のベジェ曲線 p_0^3(t) は, 以下の手順により求まる.
- 1次のベジェ曲線を求める
- 線分 z_0 z_1 を t:1-t に内分する点 p_0^1(t) を求める
- 線分 z_1 z_2 を t:1-t に内分する点 p_1^1(t) を求める
- 線分 z_2 z_3 を t:1-t に内分する点 p_1^2(t) を求める
- 2次のベジェ曲線を求める
- 線分 p_0^1(t) p_1^1(t) を t:1-t に内分する点 p_0^2(t) を求める
- 線分 p_1^1(t) p_2^1(t) を t:1-t に内分する点 p_1^2(t) を求める
- 線分 p_0^2(t) p_1^2(t) を t:1-t に内分する点 p_0^3(t) を求める
以上をまとめると以下のようになる.
\begin{aligned}
p_0^3(t)
&= (1-t) p_0^2(t) + t p_1^2(t) \\
&= (1-t) [ (1-t) p_0^1(t) + t p_1^1(t) ]
+ t [ (1-t) p_1^1(t) + t p_2^1(t) ] \\
&= (1-t) [ (1-t) \{ (1-t) p_0^0(t) + t p_1^0(t) \}
+ t \{ (1-t) p_1^0(t) + t p_2^0(t) \} ] \\
& + t [ (1-t) \{ (1-t) p_0^1(t) + t p_1^2(t) \}
+ t \{ (1-t) p_2^0(t) + t p_3^0(t) \} ] \\
&= (1-t)^3 p_0^0(t) + 3(1-t)^2 t p_1^0(t) + 3(1-t) t^2 p_2^0(t) + t^3 p_3^0(t) \\
&= (1-t)^3 z_0 + 3(1-t)^2 t z_1 + 3(1-t)t^2 z_2 + t^3 z_3 \\
\end{aligned}
この式展開は以下のように図示することができる.
例えば, p_0^3(t) から p_1^0 にたどり着くためには, 3回の分岐のうち, 左(t-1 がかかる)を2回, 右(t がかかる)を1回選択すればよく, その組み合わせの数は {}_3 \mathrm{C}_1 = 3 となる. これは第2項の係数に等しい.
このように考えると, 3次のベジェ曲線の式は以下のように書き換えることができる.
p_0^3(t) = \sum_{i=0}^3 {}_3 \mathrm{C}_i (1-t)^{3-i} t^i z_i
一般化
n 次のベジェ曲線を考える.
3次までのベジェ曲線の導出からの類推より, 制御点 z_i \ (i=0,\ldots, n) により構成される n 次のベジェ曲線は以下の漸化式により定義される.
\begin{aligned}
p_i^j(t) &= z_i & \mathrm{for}\ & j=0 \\
p_i^j(t) &= (1-t) p_i^{j-1}(t) + t p_{i+1}^{j-1}(t) & \mathrm{for}\ & j=1,\ldots, n \\
\end{aligned}
ここで, i=0,\ldots,n-j.
この漸化式を展開すると, z_i の係数は n 回の分岐から i 回右を選ぶ選び方の数に等しいので, 結局以下のように書ける.
p_0^n(t) = \sum_{i=0}^n {}_n \mathrm{C}_i (1-t)^{n-i} t^i z_i
ベジェ曲線の性質
通る点
ベジェ曲線は端点(z_0, z_n)を通る. 実際,
\begin{aligned}
p_0^n(0) &= \sum_{i=0}^n {}_n \mathrm{C}_i (1-0)^{n-i} 0^i z_i = z_0 \\
p_0^n(1) &= \sum_{i=0}^n {}_n \mathrm{C}_i (1-1)^{n-i} 1^i z_i = z_n \\
\end{aligned}
これはベジェ曲線が, t=0 のとき z_0, t=1 のとき z_n を通ることを表している.
端点における接線
ベジェ曲線の t による微分を考える.
\begin{aligned}
\dfrac{dp_0^n(t)}{dt}
&= \dfrac{d}{dt}\sum_{i=0}^n {}_n \mathrm{C}_i (1-t)^{n-i} t^i z_i \\
&= - \sum_{i=0}^{n-1} (n-i) \cdot {}_n \mathrm{C}_i (1-t)^{n-i-1} t^i z_i \\
&+ \sum_{i=1}^n i \cdot {}_n \mathrm{C}_i (1-t)^{n-i} t^{i-1} z_i
\end{aligned}
ここで, d(1-t)^0/dt = dt^0/dt = 0であることを使った.
第2項について, ダミーインデックスを i=i'+1 と書き換えるて, i' を改めて i とする.
\begin{aligned}
\dfrac{dp_0^n(t)}{dt}
&= - \sum_{i=0}^{n-1} (n-i) \cdot {}_n \mathrm{C}_i (1-t)^{n-i-1} t^i z_i \\
&+ \sum_{i=0}^{n-1} (i+1) \cdot {}_n \mathrm{C}_{i+1} (1-t)^{n-i-1} t^i z_{i+1} \\
\end{aligned}
コンビネーションの部分は,
\begin{aligned}
(n-i) \cdot {}_n \mathrm{C}_i
&= (n-i)\dfrac{n!}{(n-i)!i!} \\
&= n\dfrac{(n-1)!}{(n-1-i)!i!} \\
&= n \cdot {}_{n-1} \mathrm{C}_i \\
(i+1) \cdot {}_n \mathrm{C}_{i+1}
&= (i+1)\dfrac{n!}{(n-i-1)!(i+1)!} \\
&= n\dfrac{(n-1)!}{(n-i-1)!i!} \\
&= n \cdot {}_{n-1} \mathrm{C}_i \\
\end{aligned}
\Delta z_i := z_{i+1} - z_i としてまとめると,
\dfrac{dp_0^n(t)}{dt}
= n\sum_{i=0}^{n-1} {}_{n-1} \mathrm{C}_i (1-t)^{n-1-i} t^i \Delta z_i
特に t=0, 1 の場合を考えると,
\begin{aligned}
\dfrac{dp_0^n(0)}{dt}
&= n \Delta z_0 = n (z_1 - z_0) \\
\dfrac{dp_0^n(1)}{dt}
&= n \Delta z_{n-1} = n (z_n - z_{n-1}) \\
\end{aligned}
すなわち, 端点の接線ベクトルは隣接する制御点の方向を向いている.
凸包
ベジェ曲線は制御点から構成される凸包に含まれる.
制御点の集合を S とする.
S の凸包 \mathrm{conv}(S) は以下のように定義される.
\mathrm{conv}(S):=
\Big\{
\sum_{i=0}^n \alpha_i z_i \Big|
z_i \in S,
\alpha_i \ge 0,
\sum_{i=0}^n \alpha_i = 1
\Bigr\}
これをベジェ曲線に当てはめると, \alpha_i = {}_n \mathrm{C}_i (1-t)^{n-i} t^i であり,
\begin{aligned}
\sum_{i=0}^n \alpha_i
&= \sum_{i=0}^n {}_n \mathrm{C}_i (1-t)^{n-i} t^i \\
&= (1-t+t)^n \\
&= 1 \\
\end{aligned}
したがって, ベジェ曲線の各点は凸包内の定義を満たしているから凸包に含まれる.
ベジェ曲線による円弧の近似
設定
単位円の第一象限部分を3次のベジェ曲線 p_0^3(t) により近似することを考える.
単位円の性質から以下の条件が導かれる.
-
(1,0)^\top を通る
-
(1,0)^\top の接線は鉛直方向
-
(0,1)^\top を通る
-
(0,1)^\top の接線は水平方向
-
y=x について対称
これらを満たす制御点は以下のとおり.
\begin{aligned}
z_0 &= (1,0)^\top \\
z_1 &= (1,\kappa)^\top \\
z_2 &= (\kappa,1)^\top \\
z_3 &= (0,1)^\top \\
\end{aligned}
ここで, 0<\kappa <1.
パラメータの導出
\kappa を求めるためにはもう一つ条件が必要となるが, ここでは以下の条件を課す.
p_0^3\left(\dfrac{1}{2}\right) =
\begin{pmatrix}
\sqrt{2} / 2 \\
\sqrt{2} / 2
\end{pmatrix}
これはベジェ曲線の t=1/2 の点が単位円上の \pi/4 の点と一致することを意味している. まず左辺を計算すると,
\begin{aligned}
p_0^3\left(\dfrac{1}{2}\right)
&= \dfrac{1}{8} z_0 + \dfrac{3}{8} z_1 + \dfrac{3}{8} z_2 + \dfrac{1}{8} z_3 \\
&=
\begin{pmatrix}
\dfrac{1+3+3\kappa +0}{8} \\
\dfrac{0+3\kappa +3+1}{8}
\end{pmatrix} \\
&=
\begin{pmatrix}
\dfrac{4+3\kappa}{8} \\
\dfrac{4+3\kappa}{8}
\end{pmatrix} \\
\end{aligned}
したがって, 条件式に代入し \kappa を求めると,
\begin{aligned}
\dfrac{4+3\kappa}{8}
&= \dfrac{\sqrt{2}}{2} \\
\kappa
&= \dfrac{4(\sqrt{2}-1)}{3}
(=0.55228474983\cdots)\\
\end{aligned}
注意 : このようにして生成されるベジェ曲線は円弧に対する近似として広く使用されているようであるが, この曲線は円弧に一致するか外側を通っているので, ベジェ曲線と円弧の距離が最小になっているか, という意味では最適な近似ではない.
Discussion