フラクタル図形


[注意] 本年度の授業ではこの課題を提出する必要はありません。

自然界では、ある物をどんどん細かくみていくと再び元の形が 現れることがあります。 そのような図形では、自分自身を縮小した図形を自分の一部分として 含んでいることになります。 これを自己相似形といいます。 フラクタルとはそのようなパターンを扱う学問分野です。

フラクタル構造を持つものの例として、地形や樹木の形などが有名です。 そこで、樹木の形を再帰的に定義して、画像を生成してみることにしましょう。


「あとどれだけ深く再帰呼び出しを繰り返すか」を 変数 level として メソッドに渡していく方法で書いた プログラムが FractalTree.java です。

FractalTree.java
     1	import java.awt.*;
     2	import java.awt.geom.*;
     3	import java.awt.event.*;
     4	import java.util.*;
     5	
     6	public class FractalTree extends ToyGraphics {
     7	    public FractalTree() { this(640,480); }
     8	    public FractalTree(int w,int h) { super(w,h); }
     9	    public static void main(String[] args) {
    10		FractalTree tree = new FractalTree();
    11		tree.run();
    12	    };
    13	    public void run() {
    14		tree(6,80,400,100,-Math.PI/2,Math.PI/6); // spring
    15		tree(7,240,400,100,-Math.PI/2,Math.PI/6); // summer
    16		tree(7,400,400,100,-Math.PI/2,Math.PI/4); // autumn
    17		tree(5,560,400,100,-Math.PI/2,Math.PI/4); // winter
    18		repaint(0,0,width,height);
    19	    }
    20	    void tree(int level,double x,double y,double length,double angle,double theta) {
    21		if (level <= 0) return;
    22		double x1 = length * Math.cos(angle) + x;
    23		double y1 = length * Math.sin(angle) + y;
    24		g2d.setColor(Color.white);
    25		g2d.draw(new Line2D.Double(x,y,x1,y1));
    26		double len = length * 0.5;
    27		tree(level-1,x1,y1,len,angle,theta);
    28		x1 = length * Math.cos(angle)/3 + x;
    29		y1 = length * Math.sin(angle)/3 + y;
    30		tree(level-1,x1,y1,len,angle+theta,theta);
    31		x1 = length * Math.cos(angle)*2/3 + x;
    32		y1 = length * Math.sin(angle)*2/3 + y;
    33		tree(level-1,x1,y1,len,angle-theta,theta);
    34	    }
    35	    public void mousePressed(MouseEvent e) { System.exit(0); }
    36	}



コンピュータグラフィックス 演習


作成したプログラムが正しく動作することを確認したら、それぞれの 提出先に提出しなさい。

提出した後は、正しく提出されていることを http://nw.tsuda.ac.jp/class/algoB/local/handin/ で必ず確認しておいて下さい。

課題提出〆切は次回の講義が始まる時刻です。


課題3: フラクタル図形

提出ファイルBroccoli.java
コメント欄:なし
提出先: 「宿題提出Web:コンピュータグラフィックス:課題3」 http://nw.tsuda.ac.jp/class/cg/local/handin/up.php?id=kadai3

樹木曲線 (tree curve) を描くjavaのプログラム Broccoli.java を作成しなさい。


Broccoli.javaの実装例
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import java.util.*;

public class Broccoli extends ToyGraphics {
    public Broccoli() { this(640,480); }
    public Broccoli(int w,int h) { super(w,h); }
    public static void main(String[] args) {
	Broccoli tree = new Broccoli();
	tree.run();
    };
    public void run() {
	tree(14,320,479,100,-Math.PI/2,Math.PI/6);
	repaint(0,0,width,height);
    }
    void tree(int level,double x,double y,double length,double angle,double theta) {

	// [課題] 樹木曲線を描くためのJavaのコードを書きなさい。

    }
    public void mousePressed(MouseEvent e) { System.exit(0); }
}