import java.awt.*;
import java.applet.Applet;
public class Hilberverb extends Applet { 
//
//
//  Basismethoden: Nach links, nach rechts, oben und unten.
//
//
public Point Li(Graphics g, Point a, int h) // Eingabe des Anfangspunkts,
                                             // Ausgabe des Endpunkts.
					   {
     int[] x = {a.x, a.x - h};
     int[] y = {a.y, a.y};
     g.drawPolygon(x, y, 2);
     a.x  = x[1];
     return a;
     }
//
//
//
public Point Re(Graphics g, Point a, int h) // Eingabe des Anfangspunkts,
                                             // Ausgabe des Endpunkts.
					   {
     int[] x = {a.x, a.x + h};
     int[] y = {a.y, a.y};
     g.drawPolygon(x, y, 2);
     a.x  = x[1];
     return a;
     }
//
//
//
public Point Un(Graphics g, Point a, int h) // Eingabe des Anfangspunkts,
                                             // Ausgabe des Endpunkts.
					   {
     int[] x = {a.x, a.x};
     int[] y = {a.y, a.y+ h};
     g.drawPolygon(x, y, 2);
     a.y  = y[1];
     return a;
     }
//
//
public Point Ob(Graphics g, Point a, int h) // Eingabe des Anfangspunkts,
                                             // Ausgabe des Endpunkts.
					   {
     int[] x = {a.x, a.x};
     int[] y = {a.y, a.y - h};
     g.drawPolygon(x, y, 2);
     a.y  = y[1];
     return a;
     }
//
//
//
// 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)  {
     a = Li(g, a, h);
     a = Un(g, a, h);
     a = Re(g, a, h);
     return a;}
if (level > 1) {
    //
    a = D(g, a, level - 1, h);
    //
    //  Zwischenschritt nach links kommt als naechstes.  
    //
    a = Li(g, a, h);
    //
    //
    //
    a= A( g, a, level - 1, h); 
    //   
    //  Jetzt nach unten. 
    //
    a = Un(g, a, h);
    //
    //
    //
    a = A(g, a, level - 1, h);
    //
    // Jetzt nach rechts.
    //
    a = Re(g, a, h);
    // 
    //
    a = B(g, a, level - 1, h);
    return a;
}
return a; //Nur zur Sicherheit. Verlangt der Compiler. 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)  {
     a = Ob(g, a, h);
     a = Re(g, a, h);
     a = Un(g, a, h);
     return a;}
//
//
if (level > 1) {
    //
    a = C(g, a, level - 1, h);
    //
    // Ein Zwischenschritt nach oben kommt als naechstes.  
    //
    a = Ob(g, a, h);
    //
    //
    //
    a= B(g, a, level - 1, h); 
    //   
    a = Re(g, a, h);
    //
    //
    a = B(g, a, level - 1, h);
    //
    a = Un(g, a, h);
    //
    //
    a = A(g, a, level - 1, h);
    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)  {
     a = Re(g, a, h);
     a = Ob(g, a, h);
     a = Li(g, a, h);
     return a;}
    //
    //
    //    
    if (level > 1) {
    //
    a = B(g, a, level -1, h);
    //
    // Zwischenschritt nach rechts.
    //
    a = Re(g, a, h);
    //
    //
    a= C( g, a, level - 1, h); 
    //   
    // Zwischenschritt nach oben. 
    //
    a = Ob(g, a, h);
    //
    //
    a = C(g, a, level - 1, h);
    //
    // Zwischenschritt nach links.
    //
    a = Li(g, a, h);
    //
    a = D(g, a, level - 1, h);
    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)  {
     a = Un(g, a, h);
     a = Li(g, a, h);
     a = Ob(g, a, h);
     return a; }
//
//
//  
if (level > 1) {
    //
    a = A(g, a, level - 1, h);
    //
    // Zwischenschritt nach unten.
    //
    //
    a = Un(g, a, h);
    //
    //
    a= D( g, a, level - 1, h); 
    //   
    // Zwischenschritt nach links.
    //
    a = Li(g, a, h);
    //
    a = D(g, a, level - 1, h);
    //
    // Zwischenschritt nach oben.
    //
    a = Ob(g, a, h);
    //
    //
    a = C(g, a, level - 1, h);
    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(900,100);
	int h = 2; // Die Basislaenge. 
	int level = 6;
	//
	// Hier passierte die Eingabe.
	//
	A(g, a, level, h);
	//B(g, a, level, h);
	//C(g, a, level, h); 
	//D(g, a, level, h); 
	}
}	
	


