import java.awt.*;
import java.applet.Applet;
public class Hilber extends Applet { 
//
//
// Es wird der Anfangspunkt angegeben 
// und der Endpunkt ausgegeben. Hier ist das A. 
// 
//
//
public Point A(Graphics g, Point a, int level, int h){
//
//
if (level <= 0) return a;
//
// 
if (level == 1)  {
     int[] x = {a.x, a.x - h};
     int[] y = {a.y, a.y};
     g.drawPolygon(x, y, 2);
     x[0] = a.x -h;
     x[1] = a.x -h;
     y[0] = a.y;
     y[1] = a.y + h;
     g.drawPolygon(x  , y, 2);
     x[0] = a.x - h;
     x[1] = a.x ;
     y[0] = a.y +h ;
     y[1] = a.y +h;
     g.drawPolygon(x, y, 2);
     a.y  = a.y + h;
     return a; 
     }
if (level > 1) {
    //
    a = D(g, a, level - 1, h/2);
    //
    //  Zwischenschritt nach links kommt als naechstes.  
    //
    int[] x = { a.x, a.x - h/(int) Math.round(Math.pow(2, level - 1))};
    int[] y = { a.y, a.y};
    //
    g.drawPolygon(x,y,2);
    a.x = x[1] ;    // Damit ist a der naechste 
                   //Anfangspunkt.
    //
    //
    a= A( g, a, level - 1, h/2); 
    //   
    //  Jetzt nach unten. 
    //
    x[0] = a.x;
    x[1] = a.x;
    y[0] = a.y;
    y[1] = a.y + h/(int) Math.round(Math.pow(2, level - 1)); 
    //
    g.drawPolygon(x,y,2);
    a.y = y[1];
    //
    //
    a = A(g, a, level - 1, h/2);
    //
    // Jetzt nach rechts.
    //
    x[0] = a.x;
    x[1] = a.x + h/(int) Math.round(Math.pow(2, level - 1));
    y[0] = a.y;
    y[1] = a.y;
    // 
    g.drawPolygon(x, y, 2);
    a.x = x[1];
    //
    a = B(g, a, level - 1, h/2);
    return a;
}
return a; //Nur zur Sicherheit. Und A ist am Ende. 
}
//
// Jetzt kommt die Methode B. 
//
public Point B(Graphics g, Point a, int level, int h){
//
//
if (level <= 0) return a;
//
// 
if (level == 1)  {
     int[] x = {a.x, a.x };
     int[] y = {a.y, a.y - h};
     g.drawPolygon(x, y, 2);
     x[0] = a.x ;
     x[1] = a.x+ h;
     y[0] = a.y - h;
     y[1] = a.y - h;
     g.drawPolygon(x  , y, 2);
     x[0] = a.x + h;
     x[1] = a.x + h ;
     y[0] = a.y - h;
     y[1] = a.y ;
     g.drawPolygon(x, y, 2);
     a.x  = a.x + h;
     return a; 
     }
if (level > 1) {
    //
    a = C(g, a, level - 1, h/2);
    //
    // Ein Zwischenschritt nach oben kommt als naechstes.  
    //
    int[] x = { a.x, a.x };
    int[] y = { a.y, a.y - h/(int) Math.round(Math.pow(2, level - 1))};
    //
    g.drawPolygon(x,y,2);
    a.y = y[1] ;    // Damit ist a der naechste 
                    //Anfangspunkt.
    //
    //
    a= B(g, a, level - 1, h/2); 
    //   
    x[0] = a.x ;
    x[1] = a.x + h/(int) Math.round(Math.pow(2, level - 1));  // Zwischenschritt nach rechts.
    y[0] = a.y; 
    y[1] = a.y;
    //
    g.drawPolygon(x,y, 2);
    a.x = x[1];
    //
    a = B(g, a, level - 1, h/2);
    //
    x[0] = a.x;
    x[1] = a.x;
    y[0] = a.y;
    y[1] = a.y + h/(int) Math.round(Math.pow(2, level - 1));   // Zwischenschritt nach unten. 
    //
    g.drawPolygon(x,y,2);
    a.y = y[1];
    //
    a = A(g, a, level - 1, h/2);
    return a;
}
return a; //Nur zur Sicherheit. Und B ist auch schon am Ende. 
}
//
// Nun kommt das C.
//
public Point C(Graphics g, Point a, int level, int h){
//
//
if (level <= 0) return a;
//
// 
if (level == 1)  {
     int[] x = {a.x, a.x + h};
     int[] y = {a.y, a.y };
     g.drawPolygon(x, y, 2);
     x[0] = a.x+ h;
     x[1] = a.x+ h;
     y[0] = a.y  ;
     y[1] = a.y - h;
     g.drawPolygon(x  , y, 2);
     x[0] = a.x + h;
     x[1] = a.x  ;
     y[0] = a.y - h;
     y[1] = a.y - h ;
     g.drawPolygon(x, y, 2);
     a.y  = a.y - h;
     return a; 
     }
if (level > 1) {
    //
    a = B(g, a, level - 1, h/2);
    //
    // Zwischenschritt nach rechts.
    //
    int[] x = { a.x, a.x + h/(int) Math.round(Math.pow(2, level - 1))};
    int[] y = { a.y, a.y };
    //
    g.drawPolygon(x,y,2);
    a.x = x[1] ;    // Damit ist a der naechste 
                    //Anfangspunkt.
    //
    //
    a= C( g, a, level - 1, h/2); 
    //   
    // Zwischenschritt nach oben. 
    //
    x[0] = a.x ;
    x[1] = a.x ;
    y[0] = a.y ;            
    y[1] = a.y - h/(int) Math.round(Math.pow(2, level - 1));
    //
    g.drawPolygon(x,y,2);
    a.y= y[1];
    //
    //
    a = C(g, a, level - 1, h/2);
    //
    // Zwischenschritt nach links.
    //
    x[0] = a.x;
    x[1] = a.x - h/(int) Math.round(Math.pow(2, level - 1));
    y[0] = a.y;
    y[1] = a.y;
    //
    g.drawPolygon(x,y,2); 
    a.x = x[1];
    //
    a = D(g, a, level - 1, h/2);
    return a;
}
return a; //Nur zur Sicherheit. Und C ist auch schon am Ende. 
}
//
//
// Schliesslich auch noch das D.
//
//
public Point D(Graphics g, Point a, int level, int h){
//
//
if (level <= 0) return a;
//
// 
if (level == 1)  {
     int[] x = {a.x, a.x };
     int[] y = {a.y, a.y + h };
     g.drawPolygon(x, y, 2);
     x[0] = a.x;
     x[1] = a.x - h;
     y[0] = a.y +h  ;
     y[1] = a.y + h;
     g.drawPolygon(x  , y, 2);
     x[0] = a.x - h;
     x[1] = a.x - h ;
     y[0] = a.y + h;
     y[1] = a.y ;
     g.drawPolygon(x, y, 2);
     a.x  = a.x - h;
     return a; 
     }
if (level > 1) {
    //
    a = A(g, a, level - 1, h/2);
    //
    // Zwischenschritt nach unten.
    //
    //
    int[] x = { a.x, a.x };
    int[] y = { a.y, a.y + h/(int) Math.round(Math.pow(2, level - 1))};
    //
    g.drawPolygon(x,y,2);
    a.y = y[1] ;    // Damit ist a der naechste 
                    //Anfangspunkt.
    //
    //
    a= D( g, a, level - 1, h/2); 
    //   
    // Zwischenschritt nach links.
    //
    x[0] = a.x;
    x[1] = a.x - h/(int) Math.round(Math.pow(2, level - 1));
    y[0] = a.y;
    y[1] = a.y;
    //
    g.drawPolygon(x,y,2);
    a.x = x[1];
    //
    a = D(g, a, level - 1, h/2);
    //
    // Zwischenschritt nach oben.
    //
    x[0] = a.x;
    x[1] = a.x;
    y[0] = a.y;
    y[1] = a.y - h/(int) Math.round(Math.pow(2, level - 1));
    // 
    g.drawPolygon(x,y,2);
    a.y = y[1];
    //
    a = C(g, a, level - 1, h/2);
    return a;
}
return a; //Nur zur Sicherheit. Und D ist auch schon am Ende. 
}
//
//
//
//
//
//
// Hier das Hauptprogramm.
//

   
    public  void paint(Graphics g){
        Point a = new Point(970, 20);
	int h = 256;
	int level = 5;
	//
	// Hier passierte die Eingabe.
	//
	A(g, a, level, h);
	//B(g, a, level, h);
	//C(g, a, level, h); 
	//D(g, a, level, h); 
	}
}	
	


