課題1 Bezier曲線、BSplineの描画プログラムを作成せよ

プログラム作成環境  Java ver. 1.4.2_07
動作確認済みのブラウザ Java1.4.1以降をインストールしたIE,FireFox,Opera


Bezier曲線、BSpline曲線の描画アプレット


Bezier曲線描画モードでは、次数を一つ上げて同じ曲線を描くこともできます。


Bezier曲線、BSpline曲線を描画します。
BSpline曲線は3次のものを描画しています。

- 使い方 -

アプレット上でマウスをクリックすることで制御点を指定します。
3つ以上制御点を打つと曲線が描画されます。
制御点はいくつでも指定できますが、
あまり多く指定すると誤差が累積し、
いびつな形となってしまいます(20個くらいまでがよい)。
また、一度指定した制御点をドラッグすることも可能です。

上のメニュー、ボタン等は以下の処理を行います。

  メニュー:描画モード選択
  "Bezier":Bezier曲線を描画する(青い線)
  "BSpline":3次のBSpline曲線を描画する(赤い線)
  "Bezier and BSpline":Bezier曲線、3次BSpline曲線両方を描画する
  "Only Control Points":制御点のみを描画する

  "init"ボタン:制御点をすべて消去する
  "raise Beizer Degree"ボタン:Bezier曲線の次数を1つ上げて、
    まったく同じ曲線を描画する(Bezier描画モードのみ)

Javaコード
(アプレットが動作しない場合は、このコードをコンパイルしてください。
ただし、appletviewerでは動かない可能性があります。)


結果


絵をクリックすると、拡大して表示します。

Bezier曲線の描画結果。 3次のBSpline曲線の描画結果。 BezierとBSplineの比較
BSplineの方が制御点の
近くを通っています。
Bezier曲線の描画結果2。 次数を1次あげた結果。
まったく同じ曲線が
描かれています。
次数をさらに2次あげた結果。
前と同様に同じ曲線が
描かれています。



deCastljauの分割方法


Bezier曲線を任意のところで2つに分割し、それぞれの曲線の制御点を求めます。

3次のBezier曲線におけるdeCastljauの分割を行います。

- 使い方 -

制御点とBezier曲線が描画されています。
この制御点はドラッグして移動することができます。

アプレット上部のテキストボックスに(0,1)の範囲で数値を与えると、
その値に基づいてdeCastljauの分割を行い、
黄色い直線と赤、黄色、緑色の点がそれぞれ表示されます。
それぞれの意味は次のとおりです。

  赤い点:Bezier曲線の関数にtを入れたときの点
  黄色い点:各線分を1:(1-t)で内分する点
  黄色い線:内分点間を結んだ直線
  緑色の点:deCastljauの分割方法によって新たにできた制御点

アプレット上部の"init"ボタンをクリックすると
それぞれの制御点が初期位置に戻ります。

Javaコード
(アプレットが動作しない場合は、このコードをコンパイルしてください。
ただし、appletviewerでは動かない可能性があります。)


結果


絵をクリックすると、拡大して表示します。

t=0.2での分割結果。
赤い点が黄色い直線上に
あります。
t=0.4での分割結果。
同様に赤い点が黄色い直線上に
あります。
t=0.5での分割結果。
tの値をどんなに変えても、
赤い点が黄色い直線上にあります。
t=0.7での分割結果。 制御点の位置を変えて、t=0.7で分割。
曲線が複雑になっても
必ず赤い点が黄色い直線上にあります。
さらに制御点の位置を変えて、t=0.7で分割。
制御点の位置にかかわらず、
必ず赤い点が黄色い上を通っています。


Topページへ