// 樹木曲線 [Tree.java] import java.applet.Applet; import java.awt.*; import java.awt.event.*; // JDK 1.1 public class Tree extends Applet implements ActionListener,ItemListener { // JDK 1.1 Choice nChoice,sChoice,aChoice; // チョイス Button button_rw; double scale=0.7; //(a) 枝の比率 int n=2; //(a) 繰り返し回数 int angle=30; //(a) 角度 int w,h; double ang,len; public void init() { // ロード時の初期化メソッド w=getSize().width; // 横の大きさ h=getSize().height-20; // 縦の大きさ len=100.0; //(b) 最初の長さ String ar=getParameter("angle"); //(c) 最初の角度 if (ar == null) ang=90; else ang=Double.valueOf(ar).doubleValue(); nChoice = new Choice(); // チョイス for (int i=2; i<=15; i++) { // 繰り返し回数の設定 nChoice.addItem(""+i); } sChoice = new Choice(); // チョイス for (double d=0.7; d>=0.4; d-=0.05) { // 枝の比率の設定 sChoice.addItem((d+0.001+" ").substring(0,4)); } aChoice = new Choice(); // チョイス for (int i=30; i<=90; i+=10) { // 枝の角度の設定 aChoice.addItem(""+i); } button_rw=new Button("Re-write"); // Re-writeボタン add(button_rw); // Re-writeボタン add(nChoice); // 繰り返し回数 add(new Label("n")); // ラベル add(sChoice); // チョイス add(new Label("Scale")); // 枝の比率 add(aChoice); // チョイス add(new Label("Angle")); // 角度 button_rw.addActionListener(this); // JDK 1.1 nChoice.addItemListener(this); // JDK 1.1 sChoice.addItemListener(this); // JDK 1.1 aChoice.addItemListener(this); // JDK 1.1 } //end init //============ JDK 1.1 イベント処理(ボタン) ============ public void actionPerformed(ActionEvent e) { // ボタン if (e.getSource() == button_rw) { // Re-writeボタン repaint(); } //end if } //end actionPerformed //=========== JDK 1.1 イベント処理(チョイス) =========== public void itemStateChanged(ItemEvent e) { // チョイス Object gs=e.getSource(); if (gs == nChoice) { n=nChoice.getSelectedIndex()+2; // nの取出し } else if (gs == sChoice) { // sChoice scale=0.7-sChoice.getSelectedIndex()*0.05; // scale } else if (gs == aChoice) { // aChoice angle=30+aChoice.getSelectedIndex()*10; // 角度 } //end if } //end itemStateChanged //================ グラフィックスの表示 ================ public void paint( Graphics g ) { double x0,y0; x0=w/2; //(d) 初期値 y0=0; //(d) 初期値 g.setColor(new Color(0,0,128)); // 背景色 g.fillRect(0,35,w,h-15); // 背景 g.setColor(Color.yellow); //(e) 色の設定 rtree(g,n,x0,y0,len,ang); //(f) 樹木曲線を描く } //end paint //================= 樹木曲線を再帰的に描く================= public void rtree(Graphics g,int nn,double x0,double y0, double len,double ang) { if (nn <= 0) { return; } double x,y; final double RAD=Math.PI/180.0; // ラジアンに変換 x=len*Math.cos(RAD*ang)+x0; //(g) xの計算 y=len*Math.sin(RAD*ang)+y0; //(g) yの計算 g.drawLine((int)x0,(int)(h-y0),(int)x,(int)(h-y)); rtree(g,nn-1,x,y,len*scale,ang-angle); //(h) 右の枝 rtree(g,nn-1,x,y,len*scale,ang+angle); //(h) 左の枝 } //end rtree } //end Tree