応答  ベジエ(Bezie)曲線について

 

線や局面の形を決めるというのはデザインのとき必要になります。一番原始的な方法は多数の点で形を定義し、直線で繋ぐことです。しかしこれで出来るのは多角形で角ができてしまいます。角がないよう曲線で繋ぐのはどうすればよいか。

 

昔は曲線定規を使いましたが計算機で形を決めるときはもっと数学的な方法が必要です。ベジエ曲線(ベジエはルノー自動車会社の技師だった)はこのような目的に使える方法で、点の列を正確には通らないが近傍を通りなめらかな曲線を描くとき役に立ちます。選んだ点を通らせることも可能です。以下、その原理を説明します。

 

まず点列を直線で繋ぐことを数学的に書くならば、座標上の二点を一次関数で内挿すること、つまりy=ax+bという式の係数aとbを、式が与えられた二点を通るように決めることです。つまり(x1,y1)と(x2、y2)がそれらの2点とすればy1=ax1+bとy2=ax2+bを連立式として解けばaとbが決ります。

 

さて、一次関数のかわりに2次関数、y=ax^2+bx+c、を使うとどうなるか。2点を通るという条件で2個の式が出来ますが、係数は3個あるので、もう一つ条件をつけることができます。この条件として、点のところで勾配が隣の内挿式のと一致することを条件にもちいると、すべての区間の継ぎ目で勾配(一次微係数)が連続という条件が満たされ、曲線は一次関数で内挿するよりはるかに滑らかになります。

 

さらに、3次関数、y=ax^3+bx^2+cx+d、を各区間でもちいると、線領域できまる曲線は与えれらた点を通過し、1次と2次の微係数が連続の曲線をきめられます。こうして決めた曲線をキュービックスプラインとよび、非常になめらかなのですが、欠点は(1)全領域に関する係数を連立方程式で解かなければならない、(2)振動(区間ごとに上にいったり下にいったり)の可能性が大きい、ことです。

 

ベジエ曲線というのは、3次関数を使いながらも、これらの問題を一挙に解決してしまった天才的な方法です。この方法の説明のため、点(x0、y0)、(x1、y1)、(x2、y2)、...(xn、yn)、(xn+1、yn+1)、...をベジエ曲線で継ぐとしましょう。簡単のため、上の点列でxは1ごとに増加すると仮定します(つまりx2-x1=x3-x2=...=1)。今、(x4、y4)、(x5、y5)の区間を考え、この区間で、3次関数、y=ax^3+bx^2+cx+dの係数を決めることを考えます。4個の係数を決めなくてはならないので、4個の関係式が必要です。ベジエ曲線の方法では、、(x4、y4)、(x5、y5)の点を正確に通過するのではなく、(x4、y4d)、(x5、y5d)の点を通過することにします。y4dとy5dは、それぞれ

 

y4 = (y3 + 4*y4 + y5)/6

y5= (y + 4*y + y)/6

 

という近傍のyの値の加重平均です。さらに、x5-x4=x6-x5=1という仮定を思い出して、3次関数の一次微分が差分に等しくなるという条件

 

x=x4で y=(y5-y3)/2  

x=x5で y=(y6-y4)/2  

 

を書くと、合計4個の条件が出来たわけで、4個の係数を決めることができます。各区間で同様に3次関数を決めると、驚くべく都合のよいことが起こります。

 

(a)各点で、両側の区間の二次微分が、二次差分に等しくなる。例として点4で考えると

 

    x=x4で  y = y5-2*y4+y3

 

これは点4の右の区間の3次関数も左の区間の3次関数も同じ値になる。つまり、右左の3次関数は、関数の値、一次微分、二次微分が連続ということになり、このことは全部の点で言えるので、全体がなめらかな曲線となります。

 

このようにしてできた曲線をベジエ曲線と呼びますが、上に述べた方法を一つ改良する必要があります。それは、yはxの関数として扱われていますが、曲線が垂直に近いところでは破綻します。これを避けるためには、媒介変数、たとえばt、を導入し、y=y(t)、x=x(t)、つまりxもyもtの関数と考えます。tは点から次の点までに1増加する連続変数です。

 

そうして、うえに述べたことを(t0、y0)、(t1、y1)、(t2、y2)、...(tn、yn)、(tn+1、yn+1)、...の点列に対して適用し、同様に(t0、x0)、(t1、x1)、(t2、x2)、...(tn、xn)、(tn+1、xn+1)、...にも適用します。そうして、tを変えながら(x、y)を図にかくと垂直の場所も問題がなくなり、きれいな曲線がえられます。

 

ベジエ曲線は、与えられた点列を通過しませんが、これも解決の方法があります。もしある点をベジエ曲線に通過させたければ、同じ座標を3回繰り返せばよいのです。例えば点4を通過させるためには、点列を(x0、y0)、(x1、y1)、(x2、y2)、...(x4、y4)、(x4、y4)、(x4、y4)、...(xn+1、yn+1)、...とします。

 

ベジエ曲線を決めるためには、大きな方程式を解く必要もなく、キュービックスプラインのような振動もなく、機械設計や図案を仕上げるとき非常に優れた使いやすい方法です。以上の説明では、境界条件(曲線の両端でどうするか)の設定を省きました。

 

数学的詳細と応用例は、中村の書いた本、

Numerical Analysis and Graphical Visualization with MATLAB, Prentice-Hall, 1964,

Chapter 9, Spline Functions and Nonlinear Interpolationに分かりやすく書いてありますので、ご希望の方には送ります。

 

下の写真はよくは取れていないのですが、点を直線で結んで描いた車と、ベジエ曲線で描いた車の比較です。古い車もベジエ曲線で描きなおすと新型車に見えるところが愉快です。

 

 

中村 10-7-2010