// 樹木曲線 [Tree.java](JDK 1.0.2) 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 public class Tree extends Applet { //! 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; // 縦の大きさ w=size().width; //!横の大きさ h=size().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 //============= JDK 1.0.2 イベント処理 ====================== public boolean action(Event e, Object o) { //! イベントの処理 String label = o.toString(); //! if (e.target instanceof Button) { //! STARTボタン if (label.equals("Re-write")) { repaint(); } //! } else if (e.target instanceof Choice) { //! チョイスの変更 n=nChoice.getSelectedIndex()+2; //! nの取出し scale=0.7-sChoice.getSelectedIndex()*0.05; //! scale angle=30+aChoice.getSelectedIndex()*10; //! 角度 } //! return true; //! } //end action //! //================ グラフィックスの表示 ================ 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; // ラジアンに変換 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