import java.awt.*;

public class snowflake extends Canvas {

    private final double SQ = Math.sqrt(3.0)/6;

    private final int TOPX = 100, TOPY = 10;
    private final int LEFTX = 30, LEFTY = 150;
    private final int RIGHTX = 170, RIGHTY = 150;

    private int order;


    public snowflake( int order ) {
	setSize( 200,200 );
	setBackground( Color.blue );
	this.order = order;
    } // end of snowflake constructor


    public void setOrder( int order ) {
	this.order = order;
    } // end of setOrder()

    public void resetOrder() {
	order = 1;
    } // end of resetOrder()

    public void nextOrder() {
	order++;
    } // end of nextOrder()

    public void paint( Graphics g ) {
	drawFractal( order,TOPX,TOPY,LEFTX,LEFTY,g );
	drawFractal( order,LEFTX,LEFTY,RIGHTX,RIGHTY,g );
	drawFractal( order,RIGHTX,RIGHTY,TOPX,TOPY,g );
    } // end of paint()


    public void drawFractal( int order,int x1,int y1,int x5,int y5,
			     Graphics g ) {
	int dx, dy, x2, y2, x3, y3, x4, y4;
	if ( order == 1 ) {
	    g.drawLine( x1,y1,x5,y5 );
	}
	else {
	    dx = x5 - x1;
	    dy = y5 - y1;
	    x2 = x1 + dx / 3;
	    y2 = y1 + dy / 3;
	    x3 = (int)((x1+x5)/2 + SQ * (y1-y5));
	    y3 = (int)((y1+y5)/2 + SQ * (x5-x1));
	    x4 = x1 + dx * 2/3;
	    y4 = y1 + dy * 2/3;
	    drawFractal( order-1,x1,y1,x2,y2,g );
	    drawFractal( order-1,x2,y2,x3,y3,g );
	    drawFractal( order-1,x3,y3,x4,y4,g );
	    drawFractal( order-1,x4,y4,x5,y5,g );
	}
    } // end of drawFractal()

} // end of snowflake class

