// コッホ曲線 [Koch.java] import java.applet.Applet; import java.awt.*; import java.awt.event.*; // JDK 1.1 public class Koch extends Applet implements ActionListener,ItemListener { // JDK 1.1 Button button_rw; int n=1; // 繰り返し回数 Choice nChoice; // 選択用チョイス double x0,y0; // x,y位置 double ang,len; // 回転角度 線の長さ public void init() { // ロード時の初期化メソッド nChoice = new Choice(); // チョイス for (int i=1; i<=6; i++) { // チョイスの設定 nChoice.addItem(""+i); // 項目名の作成 } button_rw=new Button("Re-write"); //(a) Re-writeボタン add(button_rw); //(a) Re-writeボタン add(nChoice); // チョイス add(new Label("Value n")); // ラベル x0=5.0; y0=0.0; // 初期値 ang=0.0; // 初期値 nChoice.addItemListener(this); // JDK 1.1 button_rw.addActionListener(this); // JDK 1.1 } //end init //============= JDK 1.1 イベント処理(ボタン) ============= public void actionPerformed(ActionEvent e) { // ボタン if (e.getSource() == button_rw) { // Re-writeボタン x0=5.0; y0=0.0; // 初期値 ang=0.0; // 初期値 repaint(); } //end if } //end actionPerformed //============ JDK 1.1 イベント処理(チョイス) ============ public void itemStateChanged(ItemEvent e) { // チョイス if (e.getSource() == nChoice) { n=nChoice.getSelectedIndex()+1; // nの取出し x0=5.0; y0=0.0; //(b) 初期値 ang=0.0; //(b) 初期値 repaint(); } //end if } //end itemStateChanged //================= グラフィックスの表示 ================= public void paint( Graphics g ) { int w,h,m; w=getSize().width; // 横の大きさ h=getSize().height; // 縦の大きさ m=(int)Math.pow(3,(double)n); //(c) 3のn乗の計算 len=(double)(w-10)/m; //(c) 1辺の長さの計算 g.setColor(new Color(0,0,128)); // 背景色 g.fillRect(0,35,w,h-35); // 背景 g.setColor(Color.yellow); // 色の設定 kochm(g,n); //(d) コッホ曲線を1本作成 } //end paint //============== コッホ曲線を1本作成する ================= public void kochm(Graphics g,int nn) { rkoch(g,nn); //(e) コッホ曲線を作成 } //end kochm //============== コッホ曲線を再帰的に作成 ================ public void rkoch(Graphics g,int nn) { double x,y,angR; if (nn <= 0) { angR=Math.PI/180.0*ang; // ラジアンに変換 x=len*Math.cos(angR)+x0; //(f) xの計算 y=len*Math.sin(angR)+y0; //(f) yの計算 g.drawLine((int)x0,(int)(160-y0),(int)x,(int)(160-y)); x0=x; y0=y; // x,yの置き換え return; } rkoch(g,nn-1); //(g) ang=ang+60; rkoch(g,nn-1); //(g) 60度回転 ang=ang-120; rkoch(g,nn-1); //(g) -120度回転 ang=ang+60; rkoch(g,nn-1); //(g) 60度回転 } //end rkoch } //end Koch