バラ曲線による繰り返し模様の生成

学籍番号:M0103196
 氏名  :坂井悠基


rose rose rose rose rose

このアプレットではバラをモチーフとして、これを数式で表すためにバラ曲線と呼ばれる数式を使いました。
ここでモチーフとなるバラの画像をいくつか紹介します。
このアプレットを用いることで上のような花の模様を作成することができます。
バラ曲線には、「分割数」「花びらの数」「花の大きさ」「変化値」を与えることができます。

「分割数」・・・0〜360の整数値を指定。値が小さいほど角ばった図形が表示されます。

「花びらの数」・・・0以上の整数を指定。指定された値nが偶数の場合は2×n枚、奇数の場合はn枚の花びらができます。

「花の大きさ」・・・0以上の整数を指定。花の大きさを変えることができます。

「変化値」・・・任意の実数値を指定します。基本は0ですが、この値を変えることでバラ曲線に一定の変化を与えることができます。

変化値を0以外にした場合、花びらの数や花の大きさは変化してしまうので注意が必要です。


アルゴリズムとプログラムの説明

ここで、バラ曲線の基本式を紹介します。

バラ曲線基本式 : x(t)=cos(nt)cos(t)    y(t)=cos(nt)sin(t)

このアプレットでは、上の基本式をさらに発展させた次の式を使っています。

バラ曲線発展式 : x(t)=(r×(a+cos(nt))cos(t))    y(t)=(r×(a+cos(nt))sin(t))

rが花の大きさ、aが変化値、nが花びらの数を表します。

次に、これをプログラム中で実装しているpaint関数の中身の解説をします。
public void paint(Graphics g) {
  int i, j;
  int radio = size;
  for (i = 0; i < n + 1; i++) {
    double ang = 2.0 * Math.PI * i / (n);//分割数nで割る
    p[i] = new Point(
      (int) (radio * (henka + Math.cos(hana * ang)) * Math.cos(ang)),
      (int) (radio * (henka + Math.cos(hana * ang)) * Math.sin(ang)));
  }

上のプログラムでは、バラ曲線のアルゴリズムを用いてpという配列の要素に座標を記録しています。
radioというのはバラ曲線の拡大・縮小を行う値で、これは「花の大きさ」のテキストフィールドの値を使用しています。
バラ曲線のアルゴリズム中にある変数n、henka、hanaというのはそれぞれ「分割数」「変化値」「花びらの数」のテキストフィールドの値を使用しています。
  int x, y;
  for(x=100;x<800;x+=100){
    for(y=100;y<800;y+=100){
      for (i = 1; i < n + 1; i++) {
        if (i < n / 6) {
          g.setColor(Color.orange);
        } else if (i >= n / 6 && i < (n * 2) / 6) {
          g.setColor(Color.yellow);
        } else if (i >= (n * 2) / 6 && i < (n * 3) / 6) {
          g.setColor(Color.green);
        } else if (i >= (n * 3) / 6 && i < (n * 4) / 6) {
          g.setColor(Color.pink);
        } else if (i >= (n * 4) / 6 && i < (n * 5) / 6) {
          g.setColor(Color.red);
        } else if (i >= (n * 5) / 6) {
          g.setColor(Color.magenta);
        }
        g.drawLine(p[i - 1].x + x, p[i - 1].y+y , p[i].x +x, p[i].y+y);
      }
    }
  }
}
次のプログラムでは、配列p[i-1]に格納されている座標から次の座標p[i]に向かって線を描画しています。
座標は全て配列に記録されているので、ここでは線の色とバラの平行移動のみを行っています。
線の色は g.setColor(Color.色の名前);というメソッドを使うことで変更できます。
平行移動はg.drawLine関数の中の変数x、yを記憶されている座標に足すことによって実現されています。
なお、このプログラムでは繰り返し模様を作ることが目的なので、for文で「描画」と「平行移動」を繰り返し行うことで模様を作成しています。


         アプレットの使い方とプログラムの流れ


このアプレットで作成した画像とその入力値はこちらで紹介します。
ソースは、こちらです。
まとめ・感想

今回のレポートでは、バラ曲線を用いて繰り返し模様を作成するアプレットを作成しました。
実際にアプレットを実行してみると、テキストフィールドに入力する値を変えることで様々な模様を作ることができ、
平行移動と拡大のみの変換で多種多様な模様が作れることがよくわかりました。
また、アプレットのプログラミングはあまりしたことがなかったため制作にはかなりの時間がかかりましたが、
その分アプレットの知識が付き、バラ曲線という特別な曲線を扱うこともできたため、とても良い勉強になったと思います。