import java.awt.* ;

class SiepCanvas extends Canvas {
  private Counter c ;

  SiepCanvas(Counter c) {    
    super() ;
    this.c = c;
  }

  static Point middle (Point p1, Point p2) {
    return new Point ((p1.h+p2.h)/2, (p1.v+p2.v)/2);
  }

  static void triangle(Graphics g, Point p1, Point p2, Point p3) {
    int [] xs = {p1.h, p2.h, p3.h} ;
    int [] ys = {p1.v, p2.v, p3.v} ;
    g.fillPolygon(xs,ys,3);
  }

  static void siep(Graphics g, int depth,Point top, Point left, Point right) {
    if (depth > 0) {
      Point m1 = middle (top,left) ;
      Point m2 = middle (left,right) ;
      Point m3 = middle (right,top) ;
    
      triangle(g, m1, m2, m3) ;
      siep(g,depth-1,top,m1,m3) ;
      siep(g,depth-1,m1,left,m2) ;
      siep(g,depth-1,m3,m2,right) ;
    }
  }


  static void paintSiep
    (Graphics g, int depth,Point top, Point left, Point right) {
    g.setColor(Color.red) ;
    triangle(g, top, left, right) ;
    g.setColor(Color.yellow) ;
    siep(g, depth, top, left, right) ;
  }

  public void paint(Graphics g) {
    int w = getSize().width ;
    int h = getSize().height ;

    Point top = new Point(w/2,0) ;
    Point left = new Point(0,h) ;
    Point right = new Point(w,h) ;
    paintSiep(g, c.get() , top, left, right) ;
  }

  public static void main(String [] args) {
     int n = 3 ;
     if (args.length > 0)
       n = Integer.parseInt(args[0]) ;
     Frame f = new Frame("Sierpinsky " + n) ;
     f.add(new SiepCanvas(new Counter (n))) ;
     f.setSize(150,75) ;
     f.setLocation(100,100) ;    
     f.show() ;
  }
}

