geometer Geschrieben 10. Februar 2004 Geschrieben 10. Februar 2004 Hallo an alle, ich beschäftige mich gerade mit Fraktalen. Einige Fraktale lassen sich auch mit Hilfe von Ersetzungssystemen (Lindenmayer-Systeme) grafisch darstellen. Am besten lässt sich die Darstellung solcher Fraktale mittels Turtlegrafik umstzen. Ich verwende eine Klasse, die diese Art des Zeichnens implementiert. import java.awt.*; import java.util.*; public class Turtle { Graphics g; Container cont; TurtleState state; Stack turtleStateStack; //Konstruktor versetzt neuerzeugte Turtle in den Ausgangszustand public Turtle(Container c, Graphics g) { this.g = g; this.cont = c; state = new TurtleState(); turtleStateStack = new Stack(); goHome(); turnNorth(); liftTail(); } //Methode zum Heben des Schwanzes public void liftTail() { state.penDown = false; } //Methode zum Senken des Schwanzes public void dropTail() { state.penDown = true; } //Methode zum Versetzen der Turtle in die Mitte des Containers public void goHome() { int width = cont.getSize().width - (cont.getInsets().left + cont.getInsets().right); int height = cont.getSize().height - (cont.getInsets().top + cont.getInsets().bottom); state.actX = cont.getInsets().left + width / 2; state.actY = cont.getInsets().top + height / 2; } //Ausrichtung der Turtle nach Norden public void turnNorth() { state.actAngle = Math.PI / 2.0; } //Vorwärtsbewegung der Turtle public void moveFwd(int dist) { int x = (int)(Math.cos(state.actAngle) * dist); int y = (int)(Math.sin(state.actAngle) * dist); y = -y; if(state.penDown) { g.drawLine(state.actX, state.actY, state.actX + x, state.actY + y); } state.actX += x; state.actY += y; } //Linksdrehung der Turtle public void turnL(double angle) { angle = angle * Math.PI / 180; state.actAngle += angle; if(state.actAngle > 360.0) { state.actAngle -= 360.0; } } //Rechtsdrehung der Turtle public void turnR(double angle) { turnL(-angle); } //Holen der letzten gespeicherten Werte für x, y, Winkel public void pushState() { turtleStateStack.push(state); } //Hinzufügen bzw Merken der aktuellen Werte für x, y und Winkel public void popState() { if(!turtleStateStack.empty()) { state = (TurtleState)turtleStateStack.pop(); } } } //Klasse zur Aufnahme von Turtle-Zuständen class TurtleState { int actX, actY; double actAngle; boolean penDown; } Nun will ich in einer Applikation oder einem Applet diese Klasse zum Darstellen von Fraktalen Gebilden verwenden. Hier führe ich mal die Verwendung am Beispiel der Kochkurve auf. import java.awt.*; import java.awt.event.*; import javax.swing.*; /** * @author Sandro Mosdzinski */ public class TestTurtle extends JFrame { int cnt; public TestTurtle() { super("TurtleTest"); addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent event) { System.exit(0); } } ); setBackground(Color.white); } public static void main(String[] args) { TestTurtle test = new TestTurtle(); test.setSize(800, 600); test.setLocation(0,0); test.show(); } public void paint(Graphics g) { g.setColor(Color.blue); Turtle t = new Turtle(this, g); t.dropTail(); t.turnR(30); koch(t, 200); t.turnR(120); koch(t, 200); t.turnR(120); koch(t, 200); /* t.turnR(90); t.moveFwd(100); t.turnL(60); t.moveFwd(100); t.turnR(120); t.moveFwd(100); t.turnL(60); t.moveFwd(100); */ } public void koch(Turtle t, int k) { if (k <= 10) t.moveFwd(k); else { koch(t, k/3); t.turnL(60); koch(t, k/3); t.turnR(120); koch(t, k/3); t.turnL(60); koch(t, k/3); } } } Nun will ich aber, anstatt die Kochkurve speziell zu zeichnen, eine Methode schreiben, welche die Parameter, die eine solche Kurve beschreiben, aufnimmt und somit die entsprechende Kurve darstellt. Die dabei übergebenen Parameter sind in einem String untergebracht, welcher z.B. so aussehen könnte. String s = "F+F--F+F" F -> zeichne Linie der Länge x f -> Vorwärtsbewegung um die Länge x, ohne eine Linie zu zeichnen + -> Drehung um einen Winkel a im Uhrzeigersinn - -> Drehung um einen Winkel a gegen den Uhrzeigersinn Das Ergebnis soll also eine Methode drawFraktal(String rule) sein, welche je nach übergebener Zeichenkette eine bestimmte Kurve zeichnet. Ich habe es schon mehrmals versucht, bin aber zu keinem vernünftigen Ergebnis gekommen (Die Rekursion erschwert die Sache ungemein) Ich wäre über jeden Hinweis dankbar Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.