Binärer Baum / Pythagoras Baum

  • Hallo hier mal ein kleine Programm das einen binären Baum oder einen Pythagoras Baum zeichnet nach ein paar bestimmten angaben, ich finde das einfach gammer geil wie der das zeichnet könnte ich mir stunden anschaun ;-)



    Bild des gezeichneten Baumes:


    BinBaumGui

    Java
    1. import java.awt.*;import javax.swing.*;public class BinBaumGui extends JFrame { BinBaumKlasse baum = new BinBaumKlasse(); BinBaumActionListener listener = new BinBaumActionListener(this); Panel draw = new Panel(); JPanel controlEast = new JPanel(); JPanel controlNorth = new JPanel(); JLabel lblBaumtiefe = new JLabel("Baumtiefe:"); JLabel lblAstlaenge = new JLabel("Astlaenge:"); JLabel lblWinkel = new JLabel("Winkel:"); JTextField txtBaumtiefe = new JTextField(); JTextField txtAstlaenge = new JTextField(); JTextField txtWinkel = new JTextField(); JButton btnErstelle = new JButton("Zeige Baum!"); BinBaumGui() { super("BinBaum"); } public void GuiErstellen() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setLayout(new BorderLayout()); this.add(controlEast, BorderLayout.EAST); controlEast.add(controlNorth, BorderLayout.NORTH); controlNorth.setLayout(new BoxLayout(controlNorth, BoxLayout.Y_AXIS)); controlNorth.add(lblBaumtiefe); controlNorth.add(txtBaumtiefe); controlNorth.add(lblAstlaenge); controlNorth.add(txtAstlaenge); controlNorth.add(lblWinkel); controlNorth.add(txtWinkel); controlNorth.add(btnErstelle); controlNorth.setBackground(Color.LIGHT_GRAY); controlEast.setBackground(Color.LIGHT_GRAY); draw.setBackground(Color.WHITE); baum.setBackground(Color.WHITE); draw.add(baum); draw.setLayout(new BorderLayout()); draw.add(baum,BorderLayout.CENTER); btnErstelle.addActionListener(listener); this.add(draw); this.setSize(700, 700); this.setVisible(true); } public static void main(String args []) { BinBaumGui meineGui = new BinBaumGui(); meineGui.GuiErstellen(); }}


    TurtleKlasse

    Java
    1. import java.awt.*;class Turtle{ protected double posX, posY; // Aktuelle Position der Turtle protected double winkel; // Aktueller Blickwinkel protected Color farbe=Color.black; // Standard-Zeichenfarbe protected Container c; // Der Zeichencontainer protected double homeX, homeY; // Home-Koordinaten protected boolean stiftUnten; protected int breiteX, hoeheY; protected Graphics g; public Turtle(Container cont) { winkel=0; stiftUnten = true; c=cont; // merken des Containers g=cont.getGraphics(); // und des GrafikObjektes breiteX = c.getBounds().width; hoeheY = c.getBounds().height; posX = breiteX / 2; posY = hoeheY; // positioniert die Turtle in die linke untere Ecke homeX = posX; homeY = posY; } public void homePosition() { posX=homeX; posY=homeY; winkel=0; } public void bewege(double laenge) { g.setColor(farbe); double neuX = posX + Math.cos(bogen(winkel))*laenge; double neuY; neuY = posY - Math.sin(bogen(winkel))*laenge; if (stiftUnten) g.drawLine((int) posX, (int) posY, (int) neuX, (int) neuY); posX = neuX; posY = neuY; } public void dreheLinks(double grad) { winkel = winkel + grad; // if (winkel > 360) winkel = winkel -360; } public void dreheRechts(double grad) { winkel = winkel - grad; // if (winkel<0) winkel = 360+winkel ; } public void back(int laenge){ dreheLinks(180); stiftHoch(); bewege(laenge); dreheRechts(180); stiftRunter(); } public void loesche() { homePosition(); int x=c.getBounds().width; int y=c.getBounds().height; g.clearRect(0, 0, x, y); } public void setFarbe(Color c) { farbe = c; } public void stiftHoch() { stiftUnten=false; } public void stiftRunter() { stiftUnten=true; } public void zeichneNormal() { g.setPaintMode(); } private double bogen(double winkel) { return winkel*Math.PI/180; }}


    Die BinBaumKlasse

    Java
    1. import java.awt.*;public class BinBaumKlasse extends Panel { Turtle meineKroete; int winkel; int astLaenge; int baumTiefe = 4; double faktor = 0.8; int c = 120; int alpha = 23; int n = 0; BinBaumKlasse() { } public void paint(Graphics g){ meineKroete = new Turtle((Container)this); meineKroete.homePosition(); meineKroete.dreheLinks(90); zeichneBinBaum(astLaenge, baumTiefe); // das auskommentieren und das andere darunter wieder rein... //zeichnePytaBaum(c, alpha, n); } public void zeichneBinBaum(double laenge, int tiefe){ zeichneStamm(laenge); if(tiefe > 0) { meineKroete.dreheLinks(winkel); zeichneBinBaum(laenge * faktor, tiefe - 1); meineKroete.dreheRechts(winkel * 2); zeichneBinBaum(laenge * faktor, tiefe - 1); meineKroete.dreheLinks(winkel); } meineKroete.stiftHoch(); zeichneStamm(-laenge); meineKroete.stiftRunter(); } public void zeichnePytaBaum(double c, double alpha, int n) { double a; double b; double beta = 90 - alpha; double winkel = alpha * Math.PI / 180; if(n <= baumTiefe) { a = Math.sin(winkel) * c; b = Math.sqrt(- Math.pow(a, 2) + Math.pow(c, 2)); meineKroete.dreheLinks(90); meineKroete.bewege(c); meineKroete.dreheRechts(90); meineKroete.bewege(c); meineKroete.dreheRechts(90); meineKroete.dreheLinks(alpha); meineKroete.bewege(b); meineKroete.dreheLinks(90); zeichnePytaBaum(b, alpha, n + 1); meineKroete.dreheRechts(90); meineKroete.bewege(- b); meineKroete.dreheRechts(alpha); meineKroete.bewege(c); meineKroete.dreheLinks(180 - beta); meineKroete.bewege(a); meineKroete.bewege(- a); meineKroete.dreheRechts(90); zeichnePytaBaum(a, alpha, n + 1); meineKroete.dreheRechts(180 - beta); meineKroete.bewege(c); meineKroete.dreheRechts(180); } } public void zeichneStamm(double laenge){ meineKroete.bewege(laenge); } public void setAstLaenge(int AstLaenge) { astLaenge = AstLaenge; } public void setBaumTiefe(int BaumTiefe) { baumTiefe = BaumTiefe; } public void setFaktor(double Faktor) { faktor = Faktor; } public void setWinkel(int Winkel) { winkel = Winkel; }}


    Und der kleine ActionListener


    Java
    1. import java.awt.event.ActionEvent;import java.awt.event.ActionListener;public class BinBaumActionListener implements ActionListener { BinBaumGui Fenster; BinBaumActionListener(BinBaumGui dasFenster) { Fenster = dasFenster; } public void actionPerformed(ActionEvent e) { Fenster.baum.setAstLaenge(Integer.parseInt(Fenster.txtAstlaenge.getText())); Fenster.baum.setBaumTiefe(Integer.parseInt(Fenster.txtBaumtiefe.getText())); Fenster.baum.setWinkel(Integer.parseInt(Fenster.txtWinkel.getText())); Fenster.baum.repaint(); }}


    Hier hab ich das ganze noch mal als jar Archiv zum direkten ausführen entweder mit doppelklick oder einfach in der konsolemit:

    Code
    1. java -jar binBaum.jar


    http://rapidshare.com/files/202904411/binbaum.jar


    Achja wenn ihr die eine zeile änder also binbaum dingens auskommentiert und pytabaum rein dann kommt ein Pythagoras - Baum ^^


    Mfg ladies