next up previous contents
Nächste Seite: Fraktale Aufwärts: Ergänzungen und Lösungen Vorherige Seite: Baumelemente auswählen   Inhalt

Korallenwachstum

In einem interessanten Modell gehen Teilchen von einer Kreislinie aus und ``taumeln'' zufällig über die Zeichenfläche. Berühren sie ein weiteres Teilchen, so setzen sie sich dort fest - ähnlich, wie dies beim Wachstum von Kristallen passiert. Wir können dies in einem kurzen Programm simulieren: In der Mitte eines Rechteckes befindet sich ein Teilchen, der ``Kristallisationskern''. In einer zufällig gewählten Richtung startet in einer gleichbleibenden Entfernung davon ein Teilchen und bewegt sich zufällig nach oben, nach links, nach rechts, nach unten oder in einer diagonalen Richtung. Diese Torkelbewegung wird so lange fortgesetzt, bis es sich an ein schon fixiertes Teilchen anlagert. Anschließend startet das nächste Teilchen. Wir erhalten ein bemerkenswertes Resultat:


\includegraphics[width=8cm]{LosKoralle.ps}


Der Programmcode ist erstaunlich einfach:

import java.awt.*;
import java.awt.event.*;
import java.util.Random;

public class Koralle extends Frame implements ActionListener {

    Random ergebnis;
    int zaehler;
    Button ok;
    TextField eingabe;

    Koralle() {
        setLayout(new FlowLayout());
        Label was = new Label("Schritte: ");
        add(was);
        eingabe = new TextField("1000", 5);
        add(eingabe);
        ok = new Button("ok");
        add(ok);
        ok.addActionListener(this);
        neuausgeben();
    }

    public void actionPerformed (ActionEvent ae) {
        if (ae.getSource() == ok) neuausgeben();
    }

    void neuausgeben() {
        zaehler = Integer.parseInt(eingabe.getText());
        repaint();
    }

    public static void main(String [] args) {
        Koralle proggi = new Koralle();
        WindowListener wl = new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        };
        proggi.addWindowListener(wl);
        proggi.setTitle("Korallenwachstum");
        proggi.setLocation(100,100); 
        proggi.setSize(750,750);
        proggi.show();
    }

    public void paint(Graphics bs) {
        int zelle[][] = new int[250][250];
        for (int i=0; i<250; i++) 
            for (int j=0; j<250; j++)
                zelle[i][j]=0;

        Color dblue = new Color(0,0,192);
        Color dred = new Color(192,0,0);
        Color dgreen = new Color(0,192,0);
        Color dyellow = new Color(192,192,0);

        bs.setColor(Color.white);
        bs.fillRect(0,50,750,700);
        bs.setColor(Color.black);

        int x=125;
        int y=125;
        ergebnis = new Random();
        zelle[x][y] = 1;
        bs.fillRect(3*x,3*y,3,3);
        for (int i=1; i<zaehler; i++) {
            boolean erledigt = false;

            int winkel = (int) (ergebnis.nextDouble()*360);
            x = (int) (100 * Math.cos(winkel)+125);
            y = (int) (100 * Math.sin(winkel)+125);

            if (i>zaehler*0.05) bs.setColor(dblue);
            if (i>zaehler*0.1) bs.setColor(dgreen);
            if (i>zaehler*0.15) bs.setColor(dred);
            if (i>zaehler*0.2) bs.setColor(Color.blue);
            if (i>zaehler*0.25) bs.setColor(Color.red);
            if (i>zaehler*0.35) bs.setColor(dyellow);
            if (i>zaehler*0.5) bs.setColor(Color.green);
            if (i>zaehler*0.6) bs.setColor(Color.yellow);
            if (i>zaehler*0.8) bs.setColor(Color.cyan);
            if (i>zaehler*0.9) bs.setColor(Color.magenta);

            while ((x>10) && (x<240) && (y>10) && (y<240) && !erledigt) {

                int torkel = (int) (ergebnis.nextDouble()*8);
                if (torkel == 0) x+=1;
                if (torkel == 1) y+=1;
                if (torkel == 2) x-=1;
                if (torkel == 3) y-=1;
                if (torkel == 4) { x+=1; y+=1; }
                if (torkel == 5) { x+=1; y-=1; }
                if (torkel == 6) { x-=1; y-=1; }
                if (torkel == 7) { x-=1; y+=1; }

                if (x<20) x=230;
                if (x>230) x=20;
                if (y<20) y=230;
                if (y>230) y=20;
    
                if ((zelle[x-1][y+1]==1) || (zelle[x-1][y]==1) || 
                    (zelle[x-1][y-1]==1) || (zelle[x][y+1]==1) || 
                    (zelle[x][y-1]==1) || (zelle[x+1][y+1]==1) || 
                    (zelle[x+1][y]==1) || zelle[x+1][y-1]==1) {

                    zelle[x][y]=1;
                    bs.fillRect(3*x,3*y,4,4);
                    erledigt = true;
                }
            }
        }
    }
}

Um ein farblich abgestuftes Bild zu erhalten, wird die Zeichenfarbe nach einer bestimmten Schrittzahl gewechselt. Bedeutsam ist die Abfrage, ob das torkelnde Teilchen in der Nachbarschaft eines fixen Teilchens angelangt ist: Konkret wird hier für alle 8 benachbarten Positionen des Teilchens getestet. Die Boole'sche Variable erledigt hält dieses Ereignis fest - und das nächste Teilchen wird freigesetzt...


next up previous contents
Nächste Seite: Fraktale Aufwärts: Ergänzungen und Lösungen Vorherige Seite: Baumelemente auswählen   Inhalt
Alfred Nussbaumer 2003-02-10