• 目次
  • 絵描き
  • 理解
  • まとめ
  • センス

【絵描き】実際にベジェ曲線を使う技法

ベジェ曲線ついて

ベクター形式とは

【ベクター形式】画像やコンピュータグラフィックを、座標や数学的な計算による図形として表現する方式のこと。

(画像形式の例)PDF, SVG, EPSなど

ベジェ曲線はベクター形式の代表的な手法である。

【発案者】ベジェ曲線の成り立ち

この曲線の理論は、フランス自動車メーカーのド・カステリョピエール・ベジェが独立に考案しました。

1900年の真ん中ごろのお話です。

ベジェ曲線のパーツ
(アンカーポイント・ハンドル・セグメント)

ベジェ曲線を構成するアンカーポイントとハンドルを説明します。
アンカーポイントとハンドル
ベジェ曲線は, アンカーポイントとハンドルを用いてカーブを描く。 アンカーポイントとは, カーブの両端に位置する点のことであり, 曲線の始点と終点を決める。ハンドルとは, 各アンカーポイントで指定する補助点であり, カーブの曲がる方向や曲がり具合を調整する役割をもつ。
ベジェ曲線の各部の名称:
アンカーポイント:カーブの端点となる点であり, 図では点 A と B を指す。
ハンドル:アンカーポイントに付随し, カーブの曲がり方を調整する補助点である。図では, 点 B のハンドルを線分 BH として表す。
セグメント:アンカーポイント同士を結んでできるカーブそのものを指す。
制御点:アンカーポイントとハンドルをまとめた呼び名であり, 図では点 A, B, H の総称である。

【絵描き】Illustratorのベジェ曲線を使おう

【ペンツール機能】線分を描く

Illustratorの【ペンツール】機能で線分を引いてみよう。

線分の描き方

アンカーポイントを2点打つと、線分が描ける。

作業. ※iPad版Illustrator

①の場所をクリック

②の場所をクリックする

【ペンツール機能】カーブを描く

Illustratorの【ペンツール】機能で曲線カーブを引いてみよう。

カーブの描き方

アンカーポイントを打つと同時にマウスをドラッグすることでハンドルが現れる。ハンドルを調整することで、カーブを描くことができる。

始点と終点のそれぞれでハンドルを指定することができる。

作業. ※iPad版Illustrator

■終点のハンドルの調整

①の場所をクリック

②の場所をクリック、そのままドラッグしてハンドルを調整する

■始点と終点のハンドルの調整

①の場所をクリック、そのままドラッグしてハンドルを調整する

②の場所をクリック、そのままドラッグしてハンドルを調整する

【理解】ベジェ曲線の数学的解説

ベジェ曲線の数式について

ベジェ曲線の定義

$\displaystyle \mathbf{P}(t) = \sum_{k=0}^{n} {}_n \mathrm{C}_k (1-t)^{n-k}t^k \mathbf{P}_k$

定義(ベジェ曲線)
平面内の点 $\mathbf{P}_0, \mathbf{P}_1, \cdots, \mathbf{P}_n$ を与える。 $0 \leqq t \leqq 1$ に対して, 点 $\mathbf{P}(t)$ を $$ \mathbf{P}(t) = \sum_{k=0}^{n} {}_n\mathrm{C}_k (1-t)^{\,n-k} \, t^{\,k} \, \mathbf{P}_k $$ によって定める。 このとき, 点 $\mathbf{P}(t)$ の描く軌跡を ベジェ曲線(Bezier Curve)という。
例えば, $\mathbf{P}_0 = (0, 0)$, $\mathbf{P}_1 = (1, 1)$, $\mathbf{P}_2 = (2, 0)$ とする。 このとき, ベジェ曲線の定義式は $$ \mathbf{P}(t) = {}_2\mathrm{C}_0 (1-t)^2 \mathbf{P}_0 + {}_2\mathrm{C}_1 (1-t)t \mathbf{P}_1 + {}_2\mathrm{C}_2 t^2 \mathbf{P}_2 $$ である。これを計算すると, $$ \mathbf{P}(t) = (2t, -2t^2 + 2t) $$ となり, この式の軌跡が 2 次のベジェ曲線である。

ド・カステリョのアルゴリズム

$\mathbf{P}_{i, j}(t) = (1-t) \mathbf{P}_{i, j-1}(t) + t \mathbf{P}_{i+1, j-1}(t)$, $1 \leqq j \leqq n$, $0 \leqq i \leqq n-j$

ド・カステリョのアルゴリズムと呼ばれるベジェ曲線のアルゴリズムを理解してみよう。
De Casteljau のアルゴリズム
平面内の点 $\mathbf{P}_{0,0}$, $\mathbf{P}_{1,0}$, $\cdots$, $\mathbf{P}_{n,0}$ をとり, $0 \leqq t \leqq 1$ を固定する。 $1 \leqq j \leqq n$, $0 \leqq i \leqq n-j$ に対して, 次の漸化式を定める: $$ \mathbf{P}_{i,j}(t) = (1-t)\mathbf{P}_{i,j-1}(t) + t\,\mathbf{P}_{i+1,j-1}(t) $$ ただし, $$ \mathbf{P}_{i,0}(t) = \mathbf{P}_{i,0} $$ とする。 この操作を $j=1,2,\dots,n$ と繰り返して得られる点 $\mathbf{P}_{0,n}(t)$ を考える。 $\mathbf{P}_{0,n}(t)$ の $0 \leqq t \leqq 1$ における軌跡は, $n$ 次ベジェ曲線となる。
証明
§ベジェ曲線の定義の確認
$n$ 次ベジェ曲線は, 次の式で定義されていた: $$ \sum_{k=0}^{n} {}_n \mathrm{C}_k (1-t)^{n-k} t^k \mathbf{P}_{k,0} $$ ここで, 記述を簡潔にするため, $$ b_{k,j}(t) = {}_j \mathrm{C}_k (1-t)^{\,j-k} t^k $$ とおく。
§帰納法の仮定
$j$ に関して, $$ \mathbf{P}_{i,j}(t) = \sum_{k=i}^{i+j} b_{k-i,j}(t)\,\mathbf{P}_{k,0} $$ が成り立つと仮定する。 この形が $j+1$ の場合にも成り立つことを示す。
§初期段階 $j=1$ の確認
$j=1$ のとき, $$ \mathbf{P}_{i,1}(t) = (1-t)\mathbf{P}_{i,0} + t\mathbf{P}_{i+1,0} $$ である。 一方, $$ b_{0,1}(t) = 1-t,\quad b_{1,1}(t)=t $$ であるから, $$ \mathbf{P}_{i,1}(t) = b_{0,1}\mathbf{P}_{i,0} + b_{1,1}\mathbf{P}_{i+1,0} $$ となり, 仮定は $j=1$ で成り立つ。
§$j+1$ の場合の計算
帰納法の仮定を用いると, $$ \begin{aligned} \mathbf{P}_{i,j}(t) &= \sum_{k=i}^{i+j} b_{k-i,j}\mathbf{P}_{k,0},\\ \mathbf{P}_{i+1,j}(t) &= \sum_{k=i+1}^{i+j+1} b_{k-(i+1),j}\mathbf{P}_{k,0} \end{aligned} $$ である。 漸化式より, $$ \mathbf{P}_{i,j+1}(t) = (1-t)\mathbf{P}_{i,j}(t) + t\mathbf{P}_{i+1,j}(t) $$ である。よって, $\mathbf{P}_{i,j+1}(t)$ は, $$ (1-t)b_{0,j}\mathbf{P}_{i,0} + \sum_{k=i+1}^{i+j}\bigl((1-t)b_{k-i,j}+t b_{k-(i+1),j}\bigr)\mathbf{P}_{k,0} + t b_{j,j}\mathbf{P}_{i+j+1,0} $$ と書ける。
§二項係数の性質
各係数について, $$ (1-t)b_{k-i,j}+t b_{k-(i+1),j} = b_{k-i,j+1} $$ が成り立つ。 これは, $$ {}_j \mathrm{C}_{k-i} + {}_j \mathrm{C}_{k-i-1} = {}_{j+1} \mathrm{C}_{k-i} $$ を用いた直接計算による。 また, $$ (1-t)b_{0,j}=b_{0,j+1},\quad t b_{j,j}=b_{j+1,j+1} $$ である。
§帰納法の結論
以上より, $$ \mathbf{P}_{i,j+1}(t) = \sum_{k=i}^{i+j+1} b_{k-i,j+1}\mathbf{P}_{k,0} $$ が得られ, 仮定は $j+1$ に対しても成り立つ。
§ベジェ曲線との一致
特に $i=0$, $j=n$ とすると, $$ \mathbf{P}_{0,n}(t) = \sum_{k=0}^{n} b_{k,n}\mathbf{P}_{k,0} = \sum_{k=0}^{n} {}_n \mathrm{C}_k (1-t)^{n-k} t^k \mathbf{P}_{k,0} $$ となる。 ゆえに, De Casteljau の漸化式によって得られる $\mathbf{P}_{0,n}(t)$ の軌跡は, $n$ 次ベジェ曲線と一致する。
$\mathbf{P}_{0,0}$, $\mathbf{P}_{1,0}$, $\mathbf{P}_{2,0}$ の 3 点をとる。 $j=1$ のとき, $$ \mathbf{P}_{0,1} = (1-t)\mathbf{P}_{0,0} + t\mathbf{P}_{1,0}, $$ $$ \mathbf{P}_{1,1} = (1-t)\mathbf{P}_{1,0} + t\mathbf{P}_{2,0} $$ である。 $j=2$ のとき, $$ \mathbf{P}_{0,2} = (1-t)\mathbf{P}_{0,1} + t\mathbf{P}_{1,1} $$ となり,これを展開すると, $$ \mathbf{P}_{0,2} = (1-t)^2\mathbf{P}_{0,0} + 2t(1-t)\mathbf{P}_{1,0} + t^2\mathbf{P}_{2,0} $$ を得る。 したがって,$\mathbf{P}_{0,2}(t)$ の軌跡は 2 次のベジェ曲線になっている。

De Casteljauのアルゴリズムの直感的説明

ベジェ曲線が描かれる仕組み(アルゴリズム)を紹介します。

ベジェ曲線の数式の直感的に理解する

ベジェ曲線の定義

定義

平面内の点 $\mathbf{P}_0$, $\mathbf{P}_1$, $\ldots$ , $\mathbf{P}_n$ と $0 \leqq t \leqq 1$ について,次の式で表される曲線を $n$次ベジェ曲線という。

$$\displaystyle \mathbf{P}(t) = \sum_{k=0}^{n} {}_n \mathrm{C}_k (1-t)^{n-k}t^k \mathbf{P}_k$$

3次ベジェ曲線で説明をします。4点 $\mathbf{P}_0$, $\mathbf{P}_1$, $\mathbf{P}_2$, $\mathbf{P}_3$ が制御点に該当します。

ドカステリョのアルゴリズムを数式で表して、ベジェ曲線の方程式を求めます。

ド・カステリョのアルゴリズム

まず、ベジェ曲線が描かれるアルゴリズムの直感的な理解をします。

①制御点の順番を決める

次のベジェ曲線を考えます。アンカーポイントは $\mathbf{P}_0$ と $\mathbf{P}_3$ が該当します。

制御点の順番を $\mathbf{P}_0$→$\mathbf{P}_1$→$\mathbf{P}_{2}$→$\mathbf{P}_3$ とします。

②同じ比に内分する点の作図

隣り合う制御点を $m:n$ に内分する点を作図します。

今回は、3つの点ができます。

③同じ比に内分する点の作図

いまできた3点について,さらに隣り合う点同士を,また $m:n$ に内分する点を作図します。

今回は、2つの点ができます。

④同じ比に内分する点の作図

いまできた2点について,さらに隣り合う点同士を,また $m:n$ に内分する点を作図します。

この作業を繰り返した結果、1点だけになりました。

この最後の点がベジェ曲線上の点と一致します。

⑤他の点も作図

他の比でも同じ作業をしていって、たくさん点を作ったら、その集まりがベジェ曲線になります。

$m:n = 1:0$ のとき、はじめのアンカーポイントの $\mathrm{P}_0$ です。

$m:n = 0:1$ のとき、ゴールのアンカーポイントの $\mathrm{P}_1$ です。

ベジェ曲線の数学の理解

先の直感的な作図に照らし合わせて、ベジェ曲線の定義式を作っていきましょう。

①図と式を対応させる

$\mathbf{P}_0$ と $\mathbf{P}_3$ がベジェ曲線の端点(アンカーポイント)になるべき点です。

イラストレータでは、線分 $\mathbf{P}_0 \mathbf{P}_1$ と $\mathbf{P}_3 \mathbf{P}_2$ がハンドルと対応する。

②制御点を結ぶ線分の内分点をつくる

$\mathbf{P}_0$→$\mathbf{P}_1$ と $\mathbf{P}_1$→$\mathbf{P}_2$, $\mathbf{P}_2$→$\mathbf{P}_3$ の間をそれぞれ $m: n = t : 1-t$ に内分する点を $\mathbf{P}_{1,0}(t)$, $\mathbf{P}_{1,1}(t)$,$\mathbf{P}_{1,2}(t)$ とします:

  • $\mathbf{P}_{1,0}(t) = (1-t) \mathbf{P}_0 + t\mathbf{P}_1$
  • $\mathbf{P}_{1,1}(t) = (1-t) \mathbf{P}_1 + t\mathbf{P}_2$
  • $\mathbf{P}_{1,2} (t)= (1-t) \mathbf{P}_{2} + t\mathbf{P}_3$

③更に内分点をつくる

いまできた点について,$\mathbf{P}_{1,0}$→$\mathbf{P}_{1,1}$ と $\mathbf{P}_{1,1}$→$\mathbf{P}_{1,2}$ の間をそれぞれ,また $m: n = t : 1-t$ に内分する点を $\mathbf{P}_{2,0}(t), \mathbf{P}_{2,1}(t)$ とします:

  • $\mathbf{P}_{2,0}(t) = (1-t) \mathbf{P}_{1,0} + t\mathbf{P}_{1,1}$
  • $\mathbf{P}_{2,1}(t) = (1-t) \mathbf{P}_{1,1} + t\mathbf{P}_{1,2}$

④もういちど繰り返す

さらに,点$\mathbf{P}_{2,0}(t)$ → $\mathbf{P}_{2,1}(t)$ の間を結んで,また,$m: n = t : 1-t$ に内分する点 $\mathbf{P}(t)$ を決める:

  • $\mathbf{P}(t) = (1-t) \mathbf{P}_{2,0} + t\mathbf{P}_{2,1}$

⑤式を整理する

点 $\mathbf{P}_{2,0}(t)$ と $\mathbf{P}_{2,1}(t)$ は,今までの式を組み合わせると,初めの制御点 $\mathbf{P}_0$, $\mathbf{P}_1$, $\mathbf{P}_2$, $\mathbf{P}_3$ で表すことができる。$\mathbf{P}(t)$ をはじめの制御点で表すと,

$\mathbf{P}(t) = (1-t) \mathbf{P}_{2,0} + t\mathbf{P}_{2,1}$
$= (1-t)^3 \mathbf{P}_0$ $+3(1-t)^2 t \mathbf{P}_1$ $+3(1-t) t^2 \mathbf{P}_2$ $+ t^3 \mathbf{P}_3$
$\displaystyle = \sum_{k=0}^{3} {}_3 \mathrm{C}_k \ (1-t)^{3-k} \ t^k \ \mathbf{P}_k$

となる。

実数 $t(0 \leqq 0 \leqq 1)$ を1つ決めて,内分比 $m:n=t:(1-t)$となるように作った点が $\mathrm{P}(t)$ であった。

$t$ を0から1に動かしたときの軌跡である方程式 $\mathrm{P}(t)$ が3次ベジェ曲線である。

⑥一般化する

以上により, 一般の $n$ 次ベジェ曲線の数式は次のとおりである:

$$\displaystyle \mathbf{P}(t) = \sum_{k=0}^{n} {}_n \mathrm{C}_k (1-t)^{n-k}t^k \mathbf{P}_k$$

ベジェ曲線の性質について

ベジェ曲線で描いた図は拡大縮小しても明瞭である

ベジェ曲線は有限個の制御点によってのみ定義される。したがって、拡大縮小をしても制御点の相対的な位置さえ変わらなければ、実際の画像は計算(アルゴリズム)によって補完される。

ゆえに、ベジェ曲線で描いた図は拡大縮小しても明瞭なままである。

これはベクター形式の画像の特徴である。

$\mathbf{P}(t)$ $= (1-t)\mathbf{P}_{0}$ $+t\mathbf{P}_{1}$, $0 \leqq t \leqq 1$
(1次ベジェ曲線は線分である)

2点で定義される $1$ 次ベジェ曲線が線分であることを確かめてみよう。
例(1 次ベジェ曲線)
2 点 $\mathbf{P}_{0}$ と $\mathbf{P}_{1}$ を制御点とする $1$ 次ベジェ曲線 $\mathbf{P}(t)$ は, $$ \mathbf{P}(t) = (1-t)\mathbf{P}_{0} + t\mathbf{P}_{1} \quad (0 \leqq t \leqq 1) $$ である。 この式は, $\mathbf{P}(t)$ の軌跡は制御点 $\mathbf{P}_{0}$ と $\mathbf{P}_{1}$ を結ぶ線分そのものである。
証明(1 次ベジェ曲線)
§ベジェ曲線の定義
ベジェ曲線の定義式は, 次で与えられる。 $0 \leqq t \leqq 1$ に対して, $$ \mathbf{P}(t) = \sum_{k=0}^{n} {}_n \mathrm{C}_k (1-t)^{\,n-k} t^{k} \mathbf{P}_k $$ と定義される。 このとき, $$ \mathbf{P}(0) = \mathbf{P}_0, \quad \mathbf{P}(1) = \mathbf{P}_n $$ が成り立つ。
§$n=1$ の場合
$n=1$ のとき, 上の定義式は $0 \leqq t \leqq 1$ に対して, $$ \mathbf{P}(t) = (1-t)\mathbf{P}_0 + t \mathbf{P}_1 $$ となる。
§結論
$\mathbf{P}(t)$ は, 制御点 $\mathbf{P}_0$ と $\mathbf{P}_1$ を結ぶ線分上を動く。 ゆえに, $1$ 次ベジェ曲線は, 制御点を結ぶ線分であることが分かる。
$\mathbf{P}_0 = (0, 0)$, $\mathbf{P}_1 = (1, 1)$ とする。 このとき, $$ \mathbf{P}(t) = (1-t)(0, 0) + t(1, 1) = (t, t) $$ である。 したがって, $0 \leqq t \leqq 1$ のとき, $\mathbf{P}(t)$ は $\mathbf{P}_0$ と $\mathbf{P}_1$ を結ぶ線分を表す。

ベジェ曲線の接線方向は $\mathbf{P}_0$ では $\overrightarrow{\mathbf{P}_0\mathbf{P}_1}$, $\mathbf{P}_n$ では $\overrightarrow{\mathbf{P}_{n-1}\mathbf{P}_n}$
(ハンドルはアンカーポイントでの接線)

ベジェ曲線の両端点のハンドルが, ベジェ曲線の接線になっていることを証明してみよう。

命題

制御点 $\mathbf{P}_{0}$, $\mathbf{P}_{1}$, $\cdots$ , $\mathbf{P}_{n}$ から定められる $n$ 次ベジェ曲線について, 線分 $\mathbf{P}_{0}\mathbf{P}_{1}$ と $\mathbf{P}_{n-1}\mathbf{P}_{n}$ は, ベジェ曲線の点 $\mathbf{P}_{0}$ と $\mathbf{P}_{n}$ のそれぞれの接線である.

証明.

ベジェ曲線の定義式は次であった.

$0 \leqq t \leqq 1$ について,

$\mathbf{P}(t)$ $\displaystyle = \sum_{k=0}^{n} {}_n \mathrm{C}_k (1-t)^{n-k}t^k \mathbf{P}_k$.

なお, $\mathbf{P}(0) = \mathbf{P}_0$, $\mathbf{P}(1) = \mathbf{P}_n$ である.

$t$ で微分すると,

$\displaystyle \frac{d\mathbf{P}}{dt}(t)$ $\displaystyle = \sum_{k=0}^{n}{}_n \mathrm{C}_k$ $\{ k(1-t)^{n-k}t^{k-1}$ $- (n-k)(1-t)^{n-k-1}t^k \}$ $\mathbf{P}_k$

となる. $t=0, 1$ のときを計算すると,

$\displaystyle \frac{d\mathbf{P}}{dt}(0)$ $\displaystyle = - n \mathbf{P}_0$ $+n\mathbf{P}_1$ $=n \overrightarrow{\mathbf{P}_0 \mathbf{P}_1}$

$\displaystyle \frac{d\mathbf{P}}{dt}(1)$ $\displaystyle = - n \mathbf{P}_{n-1}$ $+n\mathbf{P}_n$ $=n \overrightarrow{\mathbf{P}_{n-1} \mathbf{P}_n}$

となる. したがって, ベジェ曲線 $\mathbf{P}(t)$ の $\mathbf{P}_{0}$ での接線方向は $\overrightarrow{\mathbf{P}_{0} \mathbf{P}_1}$ であり, $\mathbf{P}_{n}$ での接線方向は $\overrightarrow{\mathbf{P}_{n-1} \mathbf{P}_n}$ であることが分かる.

ゆえに, 線分 $\mathbf{P}_{0}\mathbf{P}_{1}$ と $\mathbf{P}_{n-1}\mathbf{P}_{n}$ は, ベジェ曲線の点 $\mathbf{P}_{0}$ と $\mathbf{P}_{n}$ のそれぞれの接線である.

$n=2$ のときは,

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

である。

$t=0, 1$ での微分係数は,

$\mathbf{P}'(0)$ $=2(\mathbf{P}_1-\mathbf{P}_0)$ $= 2\overrightarrow{\mathbf{P}_0\mathbf{P}_1}$

$\mathbf{P}'(1)$ $=2(\mathbf{P}_2-\mathbf{P}_1)$ $= 2\overrightarrow{\mathbf{P}_1\mathbf{P}_2}$

となる。

これがそれぞれの点での接線方向です。

ベジェ曲線は、制御点が作る凸包内にある(準備中)

[系]アンカーポイント以外の制御点はベジェ曲線上の点ではない(準備中)

まとめノート

ベジェ曲線とは

直感的に描きやすく、コンピュータやイラストソフトで滑らかに描ける曲線のこと。

制御点

$n+1$ 個の点 $\mathbf{P}_0$, $\mathbf{P}_1$, $\ldots$ , $\mathbf{P}_n$ をとる.

A. $n$ 次ベジェ曲線

$t \in [0, \ 1]$ のときの $\mathbf{P}(t)$ が描く軌跡を $n$ 次ベジェ曲線という.

$\displaystyle \mathbf{P}(t) = \sum_{k=0}^{n} {}_n \mathrm{C}_k (1-t)^{n-k} \ t^k \ \mathbf{P}_k$

B. ド・カステリョのアルゴリズム

$t \in [0, \ 1]$ とする. 下記の漸化式で定まる $\mathbf{P}(t) = \mathbf{P}_0^n(t)$ は $n$ 次ベジェ曲線と一致する. ただし, $k \in \{ 0,\ \cdots , \ n -i \}$ とする.

$$\mathbf{P}_k^i(t) = \left\{ \begin{array}{cl} \mathbf{P}_k, & i =0 \\
(1-t)\mathbf{P}_k^{i-1}(t) + t\mathbf{P}_{k+1}^{i-1}(t), & i \in \{ 1,\ \cdots , \ n\}
\end{array}\right.$$

C. ベジェ曲線の性質

  1. ハンドルはアンカーポイントの接線である
  2. アンカーポイント以外の制御点はベジェ曲線上の点ではない
  3. $1$次ベジェ曲線は, アンカーポイントを結ぶ線分を描く

ポイント解説

制御点

$\mathbf{P}_0$ と $\mathbf{P}_1$ は曲線の端点を決める

アンカーポイント

という. $\mathbf{P}_0\mathbf{P}_1$と $\mathbf{P}_n\mathbf{P}_{n-1}$ は, 端点での曲線の接線方向と曲がり具合を決める

ハンドル

という.

B

制御点の間を $(1-t):t$ に内分する点を繰り返し取るアルゴリズム:

C

拡大縮小に最適(

ベクター形式

モチベーション

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です