Zum Inhalt springen

Fraktale - Rekursion mit L-Systemen????


Empfohlene Beiträge

Geschrieben

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...