 // シルピンスキーのギャスケット [Gasket.java] 
 import java.applet.Applet; 
 import java.awt.*; 
 import java.awt.event.*;             // JDK 1.1 
 public class Gasket extends Applet 
        implements ItemListener {     // JDK 1.1 
    int n=3;               // 繰り返しの数の初期値 
    Choice nChoice;        // チョイスボタン 
    public void init() {   // ロード時の初期化メソッド 
       nChoice = new Choice();     // チョイス 
       for (int i=1; i<=6; i++) {  // チョイスの設定 
          nChoice.addItem(""+i); 
       } 
       add(nChoice);           // チョイス 
       add(new Label("n"));    // ラベル 
       nChoice.select(n-1);    // nの選択 
       nChoice.addItemListener(this);     // JDK 1.1 
    } //end init 
    //=========== JDK 1.1 イベント処理(チョイス) =========== 
    public void itemStateChanged(ItemEvent e) { 
       if (e.getSource() == nChoice) { 
          n=nChoice.getSelectedIndex()+1; // nの取出し 
          repaint(); 
        } //end if 
    } //end itemStateChanged 
    //================ グラフィックスの表示 ================ 
    public void paint( Graphics g ) { 
       int w=getSize().width-10;  // 横の大きさ JDK 1.1 
       int [] x={   0,   w,w/2};  //(a) 三角形の初期値 
       int [] y={w+50,w+50, 50};  //(a) 三角形の初期値 
       g.drawPolygon(x,y,3);      //(b) 三角形の描画 
       triangle(g,n,x,y);         //(c) 再帰呼出し 
    }  //end paint 
    //================ 三角形を再帰的に作成 ================ 
    public void triangle(Graphics g,int nn,int []x,int []y) { 
       if (nn <= 1) { return; } 
       int [] a =new int[3];   // 配列の作成 
       int [] b =new int[3];   // 配列の作成 
       int [] xx=new int[3];   // 配列の作成 
       int [] yy=new int[3];   // 配列の作成 
       a[0]=(x[0]+x[1])/2; b[0]=(y[0]+y[1])/2; //(d) 新しい点 
       a[1]=(x[1]+x[2])/2; b[1]=(y[1]+y[2])/2; //(d) 
       a[2]=(x[0]+x[2])/2; b[2]=(y[0]+y[2])/2; //(d) 
       g.drawPolygon(a,b,3);       //(e) 三角形の描画 
       //(f) 3個所に三角形を描く 
       xx[0]=a[0]; xx[1]=x[1]; xx[2]=a[1]; 
       yy[0]=b[0]; yy[1]=y[1]; yy[2]=b[1]; 
       triangle(g,nn-1,xx,yy);  //(g) 再帰呼出し 
       // 
       xx[0]=a[2]; xx[1]=a[1]; xx[2]=x[2]; 
       yy[0]=b[2]; yy[1]=b[1]; yy[2]=y[2]; 
       triangle(g,nn-1,xx,yy);  //(g) 再帰呼出し 
       // 
       xx[0]=x[0]; xx[1]=a[0]; xx[2]=a[2]; 
       yy[0]=y[0]; yy[1]=b[0]; yy[2]=b[2]; 
       triangle(g,nn-1,xx,yy);  //(g) 再帰呼出し 
    } //end triangle 
 } //end Gasket 
