|
- Applets : Fraktale : Sierpinski-Teppich -
Der fraktale Sierpinski-Teppich als Java-Applet.
Das verwendete L-System Schema: F, F -> F+F-F-FF-F-F-MF, M -> MMM, 90°
Sierpinski4.java
import java.awt.*;
import java.applet.*;
public class Sierpinski4 extends Applet {
Point a, b; // Verbindungspunkte eines Einzelschritts
int lengthF = 2; // Schrittlänge Startwert
double direction; // Richtung in Grad
double rotation = 90; // Drehung in Grad
int depth = 6; // Iterationen Startwert
Image buffer;
Graphics gBuffer;
Graphics g;
public void init() {
setBackground(new Color(250,150,0));
}
public void paint(Graphics g) {
if (buffer!=null) {
g.drawImage (buffer, 0, 0, this);
return;
}
buffer = createImage(size().width,size().height);
gBuffer = buffer.getGraphics();
gBuffer.setColor(new Color(255,255,255)); // Farbe
a = new Point(0,0); // Start-Punkt
direction = 45; // Start-Richtung in Grad
turtleGraphic(g, gBuffer, "F", depth);
}
public void turtleGraphic(Graphics g, Graphics gBuffer, String instruction, int depth) {
if (depth==0) return;
depth -= 1;
Point aMark = new Point(0,0);
double directionMark = 0;
// Dummy-Werte
int i;
char c;
for (i=0;i<instruction.length();i++) {
c = instruction.charAt(i);
// Schritt Vorwärts mit zeichnen
if (c=='F' || c=='M') {
// Produktionsregel iterieren, solange Tiefe nicht erreicht ist
if (c=='F') turtleGraphic(g, gBuffer, "F+F-F-FF-F-F-MF", depth);
else turtleGraphic(g, gBuffer, "MMM", depth);
// Zeichnen: Ab 'a' in Richtung 'direction' einen Schritt der Länge 'lengthF'
if (depth==0) {
double rad = 2*Math.PI/360 * direction; // Grad -> Radiant
int p = (int) Math.round(lengthF * Math.cos(rad));
int q = (int) Math.round(lengthF * Math.sin(rad));
b = new Point(a.x+p, a.y+q);
// Animations-Effekt
try {Thread.sleep(1);}
catch (InterruptedException e) {}
if (c=='F') {
gBuffer.drawLine(a.x, a.y, b.x ,b.y);
g.drawImage (buffer, 0, 0, this);
}
a = b; // Neuer Startpunkt
}
}
// Drehung links herum
else if (c=='+') direction += rotation;
// Drehung rechts herum
else if (c=='-') direction -= rotation;
// Position und Richtung speichern
else if (c=='[') {
aMark = a;
directionMark = direction;
}
// Zurück zu gespeicherter Position und Richtung
else if (c==']') {
a = aMark;
direction = directionMark;
}
}
}
}
Mehr zum Konstruktionsprinzip des Lindenmayer-Systems finden Sie unter L-System.
Download Sierpinski_Teppich.zip (Applet und Code ca. 3 kb)
© 2001-2004 Albert Kluge - Alle Rechte vorbehalten
Impressum | Datenschutz | Nutzung | eMail
|