2022年度計算機演習A・B

第13回:ベジェ曲線2

1. 曲線のパラメータ表示

次の方程式で表される楕円を考えます。

$$ x^2+4y^2=1 $$

この楕円上の点は、次のように表すことができます。

$$ x(t)=\cos(2\pi t),\quad y(t)=\frac{1}{2}\sin(2\pi t)\quad (0\leq t\leq 1) $$

パラメータ $t$ の変化に従って、点 $(x(t),y(t))$ は一つの曲線(ここでは楕円)を描きます。

このように各座標についてパラメータを用いた式で曲線を表すことを、曲線のパラメータ表示(parametric representation、媒介変数表示)と言います。

パラメータ表示を利用すれば、陽関数として $y$ を $x$ の式で表すことの難しい曲線であっても、次のコードのように簡単に描画することができます。

演習1

自然数 $a$ と $b$ に対して、パラメータ表示

$$ x(t)=\sin(a\cdot 2\pi t),\quad y(t)=\sin(b\cdot 2\pi t)\quad (0\leq t\leq 1) $$

によって与えられる曲線を考えます。これは、リサージュ曲線(Lissajous curve)と呼ばれます。

自然数 $a$ と $b$ に対するリサージュ曲線を描画する関数draw_Lissajous(a,b)を定義した上で、$a=4, b=5$ に対してその関数を呼び出してください。ただし、滑らかな曲線を描画すること。

2. ベジェ曲線

2.1. 定義

$n$ 次ベジェ曲線(Bezier curve)は、前回扱ったバーンスタイン基底関数 $B_{i,n}(t)$ を用いてパラメータ表示

$$ x(t)=\sum_{i=0}^n x_i B_{i,n}(t),\quad y(t)=\sum_{i=0}^n y_i B_{i,n}(t)\quad (0\leq t\leq 1) $$

によって与えられる曲線のことです。

ここで、$x_0,\ldots,x_n$ および $y_0,\ldots,y_n$ は定数であり、$x$ 座標と $y$ 座標はこれらを係数とするバーンスタイン多項式として表されています。

$(n+1)$ 個の点 $p_0=(x_0,y_0),\ldots,p_n=(x_n,y_n)$ をベジェ曲線の制御点(control points)と呼び、名前の通り制御点の値を変化させることによってベジェ曲線の形状を制御することができます。

2.2. $3$ 次ベジェ曲線の性質

$3$ 次ベジェ曲線を考えます。このとき、

$$ \begin{aligned} x(t) & =\sum_{i=0}^3 x_i B_{i,3}(t)=x_0\cdot(1-t)^3+x_1\cdot 3t(1-t)^2+x_2\cdot 3t^2(1-t)+x_3\cdot t^3,\\ y(t) & =\sum_{i=0}^3 y_i B_{i,3}(t)=y_0\cdot(1-t)^3+y_1\cdot 3t(1-t)^2+y_2\cdot 3t^2(1-t)+y_3\cdot t^3 \end{aligned} $$

であり、制御点は $p_0=(x_0,y_0),\ldots,p_3=(x_3,y_3)$ の $4$ 個です。

$p(t)=(x(t),y(t))$ とすれば、

$$ p(0)=p_0,\quad p(1)=p_3,\quad p'(0)=3(p_1-p_0),\quad p'(1)=3(p_3-p_2) $$

が成り立ちます。ただし、$p'(t)=(x'(t),y'(t))$ は $t$ についての微分です。

これらの式から、$3$ 次ベジェ曲線の性質として

ということが分かります。

上記の性質を確認するための例として、次の制御点によって定まる $3$ 次ベジェ曲線と、隣り合う制御点を結ぶ線分を描画してみます。

$$ p_0=(0,0),p_1=(1,2),p_2=(5,1),p_3=(3,0) $$

2.3. $3$ 次ベジェ曲線による図の描画

$3$ 次ベジェ曲線は上で確認した性質を持つために扱いやすく、複数の $3$ 次ベジェ曲線を組み合わせることで様々な図を描画することができます。

パソコンの描画ソフトでも、ベジェ曲線はよく使用されています。例えば、Windows標準の「ペイント」では、曲線を描画する際に始点 $p_0$ から終点 $p_3$ までドラッグし、その後にクリックする二つの点が順に $p_1$ と $p_2$ になるようにベジェ曲線の描画を行います。

演習2

制御点の座標を並べた行列 $P$ に対する $3$ 次ベジェ曲線を描画する関数draw_Bezier(P)を定義した上で、複数の $3$ 次ベジェ曲線を組み合わせて自由に図形や文字などを描画してください。

第13回レポート課題

演習1~演習2に取り組んでください。