Lehrer Nussbaumer - JAVA (eine kleine Einführung ;) |
---|
GrundlagenGUIEingabeAusgabeApplikationenApplets
ServletsBeispieleSpieleIDEsSkriptumJAVA-DOCS----------------- letzte Änderung: 09 December 2021 ----------------- Lehrer Nussbaumers Seite ... in Arbeit ... |
Fraktales WachstumLeonard M. Sander u.a. haben Mitte der Achzigerjahre beschrieben, wie sich Teilchen an Flächen oder bereits festsitzenden Teilchen anlagern. Bereits mit einfachen Hilfsmitteln der Java-Programmierung lässt sich dieser Vorgang simulieren: In der Mitte der Querschnittsfläche eines quadratischen Rauchfanges werden Russteilchen freigesetzt, die sich in Zufallsbewegung nach allen 8 Richtungen über die Fläche bewegen. Trifft ein Teilchen die Wand oder ein festsitzendes Teilchen haftet es sogleich fest und das nächste Teilchen wird freigesetzt... Beispiel: Fraktales Wachstum von RussteilchenCode:import java.awt.*; import java.applet.*; import java.awt.event.*; import java.util.Random; public class Russ extends Applet implements ActionListener { Random zufallszahl; int teilchenzahl; Button ok; TextField eingabe; public void init () { setBackground(Color.white); setLayout(new FlowLayout()); add(new Label("Anzahl der Teilchen: ")); eingabe = new TextField("1000", 5); add(eingabe); ok = new Button("ok"); add(ok); ok.addActionListener(this); teilchenzahl = Integer.parseInt(eingabe.getText()); } public void actionPerformed (ActionEvent ae) { if (ae.getSource() == ok) neuausgeben(); } void neuausgeben() { teilchenzahl = Integer.parseInt(eingabe.getText()); repaint(); } public void paint(Graphics bs) { int x; int y; int zelle[][] = new int[250][250]; for (int i=0; i<250; i++) for (int j=0; j<250; j++) zelle[i][j]=0; bs.setColor(Color.white); bs.fillRect(0,50,250,230); // Quadrat (= Begrenzung) festlegen und ausgeben bs.setColor(Color.red); x = 20; for (int i=0; i<210; i++) { y = i + 20; zelle[x][y] = 1; bs.fillRect(2*x,2*y,2,2); } y = 20; for (int i=0; i<210; i++) { x = i + 20; zelle[x][y] = 1; bs.fillRect(2*x,2*y,2,2); } x = 230; for (int i=0; i<210; i++) { y = i + 20; zelle[x][y] = 1; bs.fillRect(2*x,2*y,2,2); } y = 230; for (int i=0; i<210; i++) { x = i + 20; zelle[x][y] = 1; bs.fillRect(2*x,2*y,2,2); } // Teilchen erzeugen, torkeln lassen, das angelagerte Teilchen speichern und ausgeben ... bs.setColor(Color.black); zufallszahl = new Random(); // Schleife über die festgelegte Teilchenzahl for (int i=1; i<teilchenzahl; i++) { boolean erledigt = false; x=125; // Startposition in der Mitte des Quadrates y=125; // Schleife für's Torkeln while (!erledigt) { int torkel = (int) (zufallszahl.nextDouble()*8); // zufällige Ganzzahl zwischen 0 und 7 if (torkel == 0) x+=1; // Schritt nach rechts if (torkel == 1) y+=1; // Schritt nach unten if (torkel == 2) x-=1; // Schritt nach links if (torkel == 3) y-=1; // Schritt nach oben if (torkel == 4) { x+=1; y+=1; } // diagonal nach rechts unten if (torkel == 5) { x+=1; y-=1; } // diagonal nach rechts oben if (torkel == 6) { x-=1; y-=1; } // diagonal nach links oben if (torkel == 7) { x-=1; y+=1; } // diagonal nach links unten // Testen, ob das Nachbarfeld ein Wandelement oder ein angelagertes Teilchen enthält 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(2*x,2*y,3,3); erledigt = true; // "Torkel"-Schleife verlassen } } // Ende der "Torkel"-Schleife } // Ende der Schleife über die Teilchenzahl } // Ende paint() } Weitere Beispiele:Im obigen Beispiel wurde etwa die Anlagerung von Russteilchen an Gefäßwänden (im schwerelosen Raum) simuliert. Ähnlich lässt sich die Anlagerung von Teilchen auf eine horizontale Fläche darstellen: Dazu starten die "taumelnden" Teilchen an einer festen Position oberhalb der Gerade. Damit die Teilchen nicht außer die Bildfläche gelangen können, wird die Zeichenfläche nach oben und nach unten "begrenzt": Falls die y-Koordinate kleiner 20 wird, erhält das Teilchen genau die y-Koordinate 20; wird die y-Koordinate größer als 250, wird sie auf 250 gesetzt. Für die horizontale Taumelbewegung "kleben" wir die Ausgabefläche zu einem Ring zusammen: Wird die x-Koordinate kleiner als 20 so erhält das Teilchen die x-Koordinate 230 und umgekehrt... ... if (x<20) x=230; if (x>230) x=20; if (y<20) y=20; if (y>250) y=250; ... Um das zeitliche Geschehen der Anlagerung besser beurteilen zu können, wechseln wir nach verschiedenen Stadien die Farbe der Teilchen: ... for (int i=1; i<teilchenzahl; i++) { boolean erledigt = false; x = 125; y = 25; if (i>teilchenzahl*0.05) bs.setColor(dblue); if (i>teilchenzahl*0.1) bs.setColor(dgreen); if (i>teilchenzahl*0.15) bs.setColor(dred); if (i>teilchenzahl*0.2) bs.setColor(Color.blue); if (i>teilchenzahl*0.25) bs.setColor(Color.red); if (i>teilchenzahl*0.35) bs.setColor(dyellow); if (i>teilchenzahl*0.5) bs.setColor(Color.green); if (i>teilchenzahl*0.6) bs.setColor(Color.yellow); if (i>teilchenzahl*0.8) bs.setColor(Color.cyan); if (i>teilchenzahl*0.9) bs.setColor(Color.magenta); ... Im letzten Beispiel kleben wir die quadratische Fläche zu einem Torus zusammen: Dazu legen wir auch für die y-Koordinate fest, dass wie den Wert 230 erhält, wenn sie kleiner als 20 wird und umgekehrt. ... if (x<20) x=230; if (x>230) x=20; if (y<20) y=230; if (y>230) y=20; ... Zusätzlich lassen wir die Teilchen auf einer Kreislinie um den Mittelpunkt herum starten: Wir halten dabei den Radius fest und wählen eine zufällige Startposition auf dieser Kreislinie, indem wir einen zufälligen Winkel zwischen 0 und 360 Grad ermitteln. ... for (int i=1; i<teilchenzahl; i++) { boolean erledigt = false; int winkel = (int) (zufallszahl.nextDouble()*360); x = (int) (100 * Math.cos(winkel)+125); y = (int) (100 * Math.sin(winkel)+125); ... Interessanterweise erhalten wir jedoch ähnliche Korallengebilde, wenn die Startposition des Teilchens fest (etwa an der Position (20/20) gewählt wird. Dies liegt offenbar daran, dass das Teilchen auf einem Torus taumelt... |