Fakultt fr Informatik
Intern | Kontakt | Impressum | German  

Der Baum des Pythagoras

Der Baum des Pythagoras ist ein Beispiel für Rekursion. Er entsteht, indem auf eine Seite eines Quadrates zwei weitere Quadrate gestellt werden, so dass sich in der Mitte ein rechtwinkliges Dreieck ergibt und die Fläche der beiden neuen Quadrate gleich der Fläche des ursprünglichen Quadrates ist.

Das Applet:

Der Quellcode:

/*
 * Datei: Pythagoras.java
 * 
 * Beispiel fuer Objektrekursion
 *
 */

import java.io.*;
import java.applet.* ;
import java.awt.* ;
import java.lang.Math.* ;

public class Pythagoras extends Applet
{

  private PBaum p ; // Startinstanz des Baumes

  public class PBaum 
  {
    
    private int YH = 400 ;  // Breite des sichtbaren Fensters

    private Graphics g ;    // Graphics-Kontext des Applets
    private Point a ;       // Punkt a des Quadrates 
    private Point b ;       // Punkt b des Quadrates
    private int depth ;     // erreichte Tiefe des Quadrates

    private void xyLine ( Point x, Point y, Color c )
    {
      g.setColor(c);
      g.drawLine( x.x, YH-x.y ,y.x, YH-y.y ); // umdrehen der Koordinaten
                                              // da oben eigentlich 0 ist
    }

    public PBaum()
    {
    }

    public void drawTree (Graphics _g  )
    {
      g = _g ;  

      if (depth==0) return ;  // Tiefste Tiefe erreicht 

      Point l = new Point( a.y-b.y,b.x-a.x ) ; // die neuen Punkte berechnen
      Point c = new Point( b.x+l.x,b.y+l.y ) ;
      Point d = new Point( a.x+l.x,a.y+l.y ) ;

      xyLine ( a , b , Color.magenta ) ; // das Quadrat zeichnen
      xyLine ( b , c , Color.magenta ) ;
      xyLine ( c , d , Color.magenta ) ;
      xyLine ( d , a , Color.magenta ) ;


      Point e = new Point( (int)(d.x + 0.36*(c.x-d.x) + 0.48*l.x) ,
                           (int)(d.y + 0.36*(c.y-d.y) + 0.48*l.y) ) ;

      PBaum leftTree = new PBaum() ; // neue Baumobjekte erzeugen
      PBaum rightTree= new PBaum() ;
      leftTree.setOrigin ( e,c ) ;   // des Ursprung der Objekte setzen
      rightTree.setOrigin ( d,e ) ;
      leftTree.setDepth ( depth-1 ) ;// die neue Tiefe setzen
      rightTree.setDepth ( depth-1 ) ;
      leftTree.drawTree(g) ;         // die Objekte zeigen
      rightTree.drawTree(g) ;
    }

    public void setOrigin ( Point _a , Point _b ) 
    {
      a = _a ;
      b = _b ;
    }

    public void setDepth ( int _depth )
    {
      depth = _depth ;
    }

  }

  public void paint(Graphics g) 
  {
    p.drawTree(g) ;  // immer wenn das Applet gezeichnet wird soll
                     // auch der Baum neu gezeichnet werden.
  }
  
  public void start()
  {
    p = new PBaum() ; // Baumobjekt erzeugen
    p.setOrigin(new Point(200,10),new Point(280,10)) ;  // den Ursprung setzen
    p.setDepth(10) ; // die zu zeichnende Tiefe setzen

  }
}

Einbindung in eine HTML-Seite:

<applet code="Pythagoras.class" width=600 height=400>
</applet>