{"id":2978,"date":"2014-11-07T22:12:33","date_gmt":"2014-11-07T20:12:33","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=2978"},"modified":"2014-11-08T10:35:32","modified_gmt":"2014-11-08T08:35:32","slug":"turtle-grafik","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2014\/11\/turtle-grafik\/","title":{"rendered":"Turtle-Grafik"},"content":{"rendered":"<p>Die Turtle-Grafik (engl.\u00a0turtle, zu Deutsch Schildkr\u00f6te) ist eine Idee von Seynour Papert, der damit ein Lehrmodell f\u00fcr den Unterricht schaffen wollte. Popul\u00e4r wurde der Turtle sicherlich durch die \u201eKindersprache\u201c LOGO. Aber auch anderswo wurde mit dem Turtle viel gearbeitet. Und so erhielt er viele Namen. Eingef\u00fchrt in der Oberstufe durch einen Roboter (Robi oder so) bzw. den Hamster Nikki.<\/p>\n<h2>Das Turtle-Grundprogramm<\/h2>\n<p>Um den (das?) Turtle zu steuern, brauchen wir lediglich ein paar Unterprogramme:<\/p>\n<ul>\n<li>void turnright(int winkel)<\/li>\n<li>void turnleft(int winkel)<\/li>\n<li>void forwd(float step)<\/li>\n<li>void back(float step)<\/li>\n<\/ul>\n<p>Die Implementierung dieser grundlegenden Befehle ist sehr einfach. Wir werden dazu den Winkel und die Position als lokale Variablen einf\u00fchren und darauf zur\u00fcckgreifen. Die Unterprogramme werden die Variablen angle, x, y\u201a oldx, oldY nutzen:<\/p>\n<pre>import java.awt.AWTEvent;\r\nimport java.awt.Frame;\r\nimport java.awt.Graphics;\r\nimport java.awt.event.WindowEvent;\r\n\r\n@SuppressWarnings( \"serial\" )\r\npublic class Turtle extends Frame\r\n{\r\n private double angle = 0, x = 300, y = 300, oldX = 300, oldY = 300;\r\n private Graphics graphics;\r\n\r\n \/\/ Initialisiert Turtle-Grafik und bringt Frame auf den Schirm\r\n public Turtle()\r\n {\r\n setTitle( \"Turtle-Grafi\" );\r\n setSize( 600, 600 );\r\n enableEvents( AWTEvent.WINDOW_EVENT_MASK );\r\n setVisible( true );\r\n }\r\n\r\n public void setGraphics( Graphics graphics )\r\n {\r\n this.graphics = graphics;\r\n }\r\n\r\n \/\/ Methoden, die den Stift bewegen\r\n\r\n public void turnright( double degree )\r\n {\r\n if ( (angle += degree) &gt; 360 )\r\n angle %= 360;\r\n }\r\n\r\n public void turnleft( double degree )\r\n {\r\n if ( (angle -= degree) &lt; 0 )\r\n angle %= 360;\r\n }\r\n\r\n public void forwd( double step )\r\n {\r\n back( -step );\r\n }\r\n\r\n public void back( double step )\r\n {\r\n oldX = x;\r\n oldY = y;\r\n\r\n x -= step * Math.sin( Math.toRadians( angle ) );\r\n y += step * Math.cos( Math.toRadians( angle ) );\r\n\r\n graphics.drawLine( (int) x, (int) y, (int) oldX, (int) oldY );\r\n }\r\n\r\n \/\/ Events vom Schlie\u00dfen des Fensters abfangen\r\n\r\n @Override\r\n protected void processWindowEvent( WindowEvent e )\r\n {\r\n if ( e.getID() == WindowEvent.WINDOW_CLOSING )\r\n System.exit( 0 );\r\n\r\n super.processWindowEvent( e );\r\n }\r\n}<\/pre>\n<p>Mit dieser kleinen Basisklasse ist schon eine Menge machbar, wie es uns der folgende Abschnitt uns zeigen wird.<\/p>\n<h2>Dreiecke und Kurven<\/h2>\n<p>Zum Einstieg in die Turtle-Gra\ufb01k eignen sich rekursive Grundstrukturen. Dazu bieten sich Dreiecke und Kurven besonders an.<\/p>\n<h3>Dreiecke<\/h3>\n<p>Das erste darzustellende Objekt wird ein Dreieck sein. Im Dreieck werden weitere Dreiecke erscheinen, was durch Rekursion ein leicht l\u00f6sbares Problem ist. Die Dreiecke bestehen dabei aus wiederum drei Dreiecken mit der halben Seitenl\u00e4nge, die in den Spitzen sitzen. Schauen wir uns einmal das Listing an:<\/p>\n<pre>import java.awt.Graphics;\r\n\r\nfinal class Dreiecke extends Turtle\r\n{\r\n public static void main( String args[] )\r\n {\r\n new Dreiecke();\r\n }\r\n\r\n void tri( float len, int deep )\r\n {\r\n if ( deep != 0 ) {\r\n for ( int i = 1; i &lt; 4; i++ ) {\r\n forwd( len );\r\n turnright( 120 );         \/\/ (a)\r\n tri( len \/ 2, deep - 1 ); \/\/ (b)\r\n }\r\n }\r\n }\r\n\r\n public void paint( Graphics g )\r\n {\r\n setGraphics( g );\r\n tri( 100, 2 );\r\n }\r\n}<\/pre>\n<p>Werden die die Zeilen (a) und (b) vertauscht, so erscheinen die kleineren Dreiecke in die gr\u00f6\u00dferen geklappt.<\/p>\n<p>Mit<\/p>\n<pre>tri(len\/2, deep-1); back(len); turnright(120);<\/pre>\n<p>in der for-Schleife erhalten wir einen weiteren Effekt, nach dem Zeichnen einer Seite wird der Turtle r\u00fcckw\u00e4rts gesetzt. Somit ist nicht das innere des Dreieckes gef\u00fcllt, sondern die Seiten wandern nach au\u00dfen.<\/p>\n<h3>Peano-Kurve<\/h3>\n<p>Bisher wurden von uns nur gleichseitige Dreiecke untersucht. Die <a href=\"https:\/\/de.wikipedia.org\/wiki\/Peano-Kurve\">Peano-Kurve<\/a> ist ebenfalls aus einem Dreieck zusammengesetzt, jedoch ist hier die Grundfigur gleichseitig und rechtwinklig. In einem Dreieck passen zwei weitere. Auffallend ist, dass sich Peano-Kurven immer schneiden, andere Kurven machen dies \u2014 wie wir sehen werden \u2014 nicht immer. Die Peano-Kurve ist das beste Beispiel einer \ufb02\u00e4chendeckenden Kurve.<\/p>\n<pre>import java.awt.*;\r\n\r\nfinal class PeanoKurve extends Turtle\r\n{\r\n final static double SQRT2 = Math.sqrt( 2 );\r\n\r\n public static void main( String args[] )\r\n {\r\n new PeanoKurve();\r\n }\r\n\r\n void peano( double len, int deep )\r\n {\r\n if ( deep != 0 ) {\r\n forwd( len );\r\n turnleft( 135 );\r\n peano( len \/ SQRT2, deep - 1 );\r\n\r\n forwd( len \/ SQRT2 );\r\n turnleft( 90 );\r\n peano( len \/ SQRT2, deep - 1 );\r\n\r\n forwd( len \/ SQRT2 );\r\n turnleft( 135 );\r\n }\r\n }\r\n\r\n public void paint( Graphics g )\r\n {\r\n setGraphics( g );\r\n peano( 200, 5 );\r\n }\r\n}<\/pre>\n<h3>Koch-Kurve<\/h3>\n<p>Das Idee einer <a href=\"https:\/\/de.wikipedia.org\/wiki\/Koch-Kurve\">Koch-Kurve<\/a> ist einfach: Ersetzte jede gezeichnete Strecke durch eine Grundfigur. Diese Grundfigur setzt sich aus einer kleineren Grundfigur zusammen, usw. Im Gegensatz zu den anderen Programmen, wird nicht auf jeder Schachtlungstiefe gezeichnet, sondern nur auf der Untersten. Das bedeutet, nur die kleinen Strukturen kommen auf den Schirm. Zur Verdeutlichung das folgende Programm:<\/p>\n<pre>import java.awt.*;\r\n\r\nfinal class KochKurve extends Turtle\r\n{\r\n public static void main( String args[] )\r\n {\r\n new KochKurve();\r\n }\r\n\r\n void koch( double len, int deep )\r\n {\r\n if ( deep != 0 ) {\r\n koch( len \/ 3, deep - 1 );\r\n turnleft( 60 );\r\n koch( len \/ 3, deep - 1 );\r\n turnright( 120 );\r\n koch( len \/ 3, deep - 1 );\r\n turnleft( 60 );\r\n koch( len \/ 3, deep - 1 );\r\n }\r\n else \/\/ deep == 0\r\n forwd( len );\r\n }\r\n\r\n public void paint( Graphics g )\r\n {\r\n setGraphics( g );\r\n koch( 200, 3 );\r\n }\r\n}<\/pre>\n<p>Die immer gern gesehene Schnee\ufb02ocke erhalten wir durch zusammenf\u00fcgen der drei Seiten, die durch die Funktion koch() einzeln gezeichnet wurden. Die paint(\u2026)\u2013Methode erweitern wir durch eine kleine Schleife.<\/p>\n<pre>public void paint( Graphics g )\r\n{\r\n setGraphics(g);\r\n\r\n for (int i=0; i &lt; 3; i++) {\r\n koch(100, 2);\r\n turnright(120);\r\n }\r\n}<\/pre>\n<h3>Hilbert-Kurven<\/h3>\n<p>Mit der Hilbert-Kurve wollen wir das Kapitel der Kurven beenden. Das Grundprinzip wurde deutlich und die wichtigsten Namen genannt \u2014 Koch, Peano und Hilbert. In der Hilbert\u2014Kurve wird nun in den Ecken die Funktion wieder rekursiv aufgerufen, gezeichnet wird in jeder Schachtelungstiefe. Hier gilt es sich zu merken: Die Kurve hat weder Ber\u00fchrungspunkte noch Schnittpunkte.<\/p>\n<pre>import java.awt.*;\r\n\r\nfinal class HilbertKurve extends Turtle\r\n{\r\n public static void main( String args[] )\r\n {\r\n new HilbertKurve();\r\n }\r\n\r\n void hilbert( double len, int deep, int direction )\r\n {\r\n if ( deep &gt; 0 ) {\r\n turnleft( direction * 90 );\r\n hilbert( len, deep - 1, -direction );\r\n\r\n forwd( len );\r\n turnright( direction * 90 );\r\n hilbert( len, deep - 1, direction );\r\n\r\n forwd( len );\r\n hilbert( len, deep - 1, direction );\r\n\r\n turnright( direction * 90 );\r\n forwd( len );\r\n hilbert( len, deep - 1, -direction );\r\n\r\n turnleft( direction * 90 );\r\n }\r\n }\r\n\r\n public void paint( Graphics g )\r\n {\r\n setGraphics( g );\r\n hilbert( 50, 4, 1 );\r\n }\r\n}<\/pre>\n<p>Ist die Variable direction gerade, so beginnt die Hilbert-Kurve mit einer Links-\u201a andernfalls mit einer Rechtsdrehung. Das Programm enth\u00e4lt noch einen Fehler, welchen?<\/p>\n<h2>Die ersten B\u00e4ume<\/h2>\n<p>In diesem Abschnitt wollen wir uns mit B\u00e4umen besch\u00e4ftigen. Sie sind ein ebenso wie die Kurven ein gutes Beispiel der Turtle-Grafik.<\/p>\n<h3>Ein simpler Baum<\/h3>\n<p>Beginnen wir mit einem einfachen Baum, wo noch nicht Viel n\u00f6tig ist. Hier sind einfach ein paar Turtle-Befehle hintereinander gereiht worden.<\/p>\n<pre>public void tree( float len )\r\n{\r\n turnleft( 45 );\r\n forwd( len );\r\n back( len );\r\n turnright( 90 );\r\n forwd( len );\r\n back( len );\r\n turnleft( 45 );\r\n}<\/pre>\n<h3>Rekursion bringt\u2019s<\/h3>\n<p>Nun kann es mit der Baumgenerierung so richtig losgehen. Ein Baum ist ein einfaches Ge\ufb02echt aus \u00c4sten. Das Gute daran: jeder Ast hat weitere \u00c4ste. Das h\u00f6rt sich nat\u00fcrlich schon nach Rekursion an. Wir deklarieren ein Unterprogramm tree()\u201a dass eine V-f\u00f6rmige Grundstruktur zeichnet. Beim Zeichnen jedes weiteren Astes wird wieder tree() aufgerufen, bis die L\u00e4nge eines Astes auf unter 10 schrumpft.<\/p>\n<pre>import java.awt.*;\r\n\r\nfinal class Tree extends Turtle\r\n{\r\n public static void main( String args[] )\r\n {\r\n new Tree();\r\n }\r\n\r\n void tree( double len )\r\n {\r\n if ( len &gt; 10 ) {\r\n turnleft( 45 );\r\n forwd( len );\r\n tree( len \/ 2 );\r\n\r\n back( len );\r\n turnright( 90 );\r\n forwd( len );\r\n tree( len \/ 2 );\r\n\r\n back( len );\r\n turnleft( 45 );\r\n }\r\n }\r\n\r\n public void paint( Graphics g )\r\n {\r\n setGraphics( g );\r\n tree( 150 );\r\n }\r\n}<\/pre>\n<p>Anstatt mit einer Zweigl\u00e4nge abzubrechen, kann auch nach Erreichen einer bestimmten Schachtelungstiefe \u2014 also die Anzahl rekursiver Aufrufe \u2014 abgebrochen werden. Dies wollen wir jetzt einmal versuchen. Zu der L\u00e4nge eines Astes soll die Schachtelungstiefe und der Zeichenwinkel hinzukommen.<\/p>\n<p>Um etwas Spannung in den Algorithmus zu bekommen, lassen wir den Winkel immer etwas gr\u00f6\u00dfer werden. Das Ganze sieht dann so aus:<\/p>\n<pre>void tree2( float len, int deep, int angle )\r\n{\r\n if ( deep != 0 ) {\r\n turnleft( angle );\r\n forwd( len );\r\n tree2( len \/ 2, deep - 1, angle + 3 );\r\n\r\n back( len );\r\n turnright( 2 * angle );\r\n forwd( len );\r\n tree2( len \/ 2, deep - 1, angle + 3 );\r\n\r\n back( len );\r\n turnleft( angle );\r\n }\r\n}<\/pre>\n<p>Und wir erhalten mit dem Unterprogramm und der Zeile tree2( 100, 6, 20 ) einen kleinen Baum \u2014 doch irgendetwas fehlt! Es ist der Stamm. Um ihn anzuf\u00fcgen bedarf es lediglich kleiner \u00c4nderungen.<\/p>\n<pre>void tree3( double len, int deep )\r\n{\r\n if ( deep != 0 ) {\r\n forwd( len );\r\n turnleft( 45 );\r\n tree3( len \/ 1.5, deep - 1 );\r\n\r\n turnright( 90 );\r\n tree3( len \/ 1.5, deep - 1 );\r\n\r\n turnleft( 45 );\r\n back( len );\r\n }\r\n}<\/pre>\n<p>Doch auch mit Stamm wirkt der Baum zu k\u00fcnstlich. Um dem etwas entgegenzuwirken, wollen wir den Abknickwinkel und ein Verk\u00fcrzungsverh\u00e4ltnis mit einbauen. Zudem soll der rechte und linke Winkel ein anderer sein. Sie sollen dem Unterprogramm \u00fcbergeben werden. Hier das Ergebnis:<\/p>\n<pre>void tree4( double len, int deep, int angleL, int angleR, double lenL, double lenR )\r\n{\r\n if ( deep != 0 ) {\r\n forwd( len );\r\n turnleft( angleL );\r\n tree4( len * lenL, deep - 1, angleL, angleR, lenL, lenR );\r\n\r\n turnright( angleL + angleR );\r\n tree4( len * lenR, deep - 1, angleL, angleR, lenL, lenR );\r\n\r\n turnleft( angleR );\r\n back( len );\r\n }\r\n}<\/pre>\n<p>Hier k\u00f6nnen wir viele Parameter variieren und bekommen eine Vielzahl von B\u00e4umen. Mit tree(100, 6, 30, -5, 0.5, 0.75) generieren wir einen Baum im Wind.<\/p>\n<h3>Mehr Formenvielfalt<\/h3>\n<p>Leider l\u00e4sst auch dieser Baum seine Herkunft nicht verleugnen. Die \u00c4ste sind noch zu gleichm\u00e4\u00dfig. Um dem ein Ende zu setzen, werden Zufallswerte eingesetzt, damit ein Baum \u00f6fters einmal anders aussieht. Um Zufallszahlen mit Hilfe von Funktionen der Java-Bibliothek nutzen zu k\u00f6nnen, ist das Mathe-Paket einzubinden. Die Funktion rand() wird dann Zufallszahlen zwischen Null und Eins liefern. Sie k\u00f6nnen als Multiplikatoren zu der L\u00e4nge oder dem Winkel genommen werden. Die Bilder bekommen dadurch eine ganz andere Wirkung.<\/p>\n<p>Eine ganz andere M\u00f6glichkeit ist das Abweichen vom V-f\u00f6rmigen Grundmuster. Es ist aus verschiedenen Gr\u00fcnden sinnvoll, von dieser Form abzuweichen, und eine asymmetrische Figur zu w\u00e4hlen. Die Symmetrie wird insofern gebrochen, dass nicht auf jedes V ein weites folgt, die linke Seite bleibt etwas \u201eunterentwickelt\u201c. Ziel ist ein harmonischeres Bild, und eine nat\u00fcrlichere Form.<\/p>\n<pre>void tree5( double len, int deep, int angle, double factor )\r\n{\r\n if ( deep != 0 ) {\r\n turnleft( angle );\r\n forwd( len );\r\n tree5( len * factor, deep - 1, angle, factor );\r\n\r\n back( len );\r\n turnright( angle * 2 );\r\n forwd( len );\r\n turnright( angle );\r\n forwd( len );\r\n tree5( len * factor, deep - 1, angle, factor );\r\n\r\n back( len );\r\n turnleft( angle * 2 );\r\n forwd( len );\r\n turnleft( angle );\r\n forwd( len );\r\n tree5( len * factor, deep - 1, angle, factor );\r\n\r\n back( len );\r\n turnright( angle * 2 );\r\n forwd( len );\r\n tree5( len * factor, deep - 1, angle, factor );\r\n\r\n back( len );\r\n turnleft( angle );\r\n back( len );\r\n turnright( angle );\r\n back( len );\r\n turnleft( angle );\r\n }\r\n}<\/pre>\n<p>Ein Beispielaufruf: tree5( 50, 4, 30, 0.6 ),<\/p>\n<h2>L-Systeme<\/h2>\n<p>Bisher war die Umsetzung von Wachstumsprozessen ein aufw\u00e4ndiges Unterfangen. Anstatt Zwei rechts, zwei links zu diktieren, ist es w\u00fcnschenswert eine Sprache zur Formulierung von Wachstumprozessen einzuf\u00fchren. Immer ein Programm vor Augen zu haben welches mit Schl\u00fcsselw\u00f6rtern wie forwd(), left()ist auch vom mathematischen Gesichtspunkt her nicht sinnvoll. Im Jahre 1968 f\u00fchrte der Biologe Aristid Lindenmayer die sogenannten L-Svsteme (Lindenmayer-Systeme) zur Beschreibung von Wachstumsprozessen ein. Dieses System entpuppt sich bei n\u00e4herem Hinschauen als eine kontextfreie Grammatik (CFG). Wie bei der Grammatik so \u00fcblich besteht das L-System aus einem Tupel, bestehend aus einem Alphabet V = {a1, \u2026, an}, Produktionsabbildungen P: V \u2192 V* wobei V* die Menge aller bildbaren Zeichenketten beschreibt. Mit einer Zeichenkette werden nun die Wachstumsprozesse beschrieben. Dazu werden Turtle-K\u00fcrzel eingef\u00fchrt, die in folgender Tabelle aufgelistet sind.<\/p>\n<p>Zeichen: Reaktion<br \/>\nF: um Schrittweite l nach vorne<br \/>\nf: hebe Schwanz und zeichne nicht<br \/>\n+: Winkel delta gegen den Uhrzeigersinn<br \/>\n-: Winkel delta im Uhrzeigersinn<\/p>\n<p><em>Tabelle: Befehle des Automaten<\/em><\/p>\n<p>Die Konstanten l und d sind L\u00e4nge und Winkel.Die Zust\u00e4nde k\u00f6nnen als Tupel verwaltet werden. Die Eintr\u00e4ge: x bzw. y ist die Koordinate, alpha der Winkel. Der Start ist mit (0,0,0) festgesetzt. Nach Rechts wird also losgelaufen. Die oben aufgelisteten Operationen angewandt, ver\u00e4ndern das Tupel wie in der folgenden Tabelle angegeben.<\/p>\n<p>Befehl: Zustand geht \u00fcber in<br \/>\nF: (x + l * cos(alpha) , y + l * sin(alpha), alpha)<br \/>\nf: (x + l * cos(alpha), y + l * sin(alpha), alpha)<br \/>\n+: (x, y. alpha + delta)<br \/>\n-: (x, y. alpha &#8211; delta)<\/p>\n<p><em>Tabelle: \u00c4nderung des Zustandes<\/em><\/p>\n<p>Das L-System wird auch unter dem Namen Graftal gef\u00fchrt. Gelegentlich tauchen auch die Ziffern 0 und 1 auf, um keinen bzw. einen Schritt in die vorgegebene Richtung zu gehen. Eckige Klammern werden ebenso verwendet wie kennengelernt. Beispiel: 11[11]1. Gehe zwei Schritte nach vorne, zeichne dann einen Ast (die Verzweigung) von 2 Einheiten L\u00e4nge, kehre zum Verzweigungspunkt zur\u00fcck und erg\u00e4nze den Stamm um eine Einheit. Einige bekannte Kurven sollen nun in L-System-Notation verdeutlicht werden.<\/p>\n<h3>Koch<\/h3>\n<p>Wir erinnern uns da sicherlich noch an die Koch-Kurve, bestehend aus 4 Strecken. Der Winkel der Strecken betrug immer 60 Grad, sodass wir in unserem System delta = 60\u00b0 setzen k\u00f6nnen. Der Erzeugungs-String ist dann F+F&#8211;F+F. Die Abarbeitung folgt von links nach rechts, wie ein normaler mathematischer Ausdruck. Die Interpretation dieses Strings: Der Turtle geht einen Schritt der L\u00e4nge l vor, dreht sich dann um 60 Grad nach links, geht wieder einen Schritt voraus, dreht sich zweimal um 60 Grad (also dann um 120 Grad) nach links, geht anschlie\u00dfend einen Schritt vor, um dann nach einer erneuten Drehung und Schritt voran zum Ende zu kommen. In der oben geschriebenen Schreibweise h\u00e4tten wir also eine Produktionsregel, die in der Informatik die Schreibweise F \u2192\u00a0F+F&#8211;F+F bek\u00e4me.<\/p>\n<h3>Sierpinski-Pfeilspitze<\/h3>\n<p>Die gesamte Information \u00fcber den Aufbau eines Objektes fasst man nun in einem Axiom zusammen. Somit wird die Beschreibung eines Objektes sehr kurz und kann in einer Tabelle leicht beschrieben werden.<\/p>\n<p>Axiom: L<br \/>\nProduktionsregeln: L \u2192\u00a0+R-L-R+<br \/>\nR \u2192\u00a0-L+R+L<br \/>\ndelta: 60\u00b0<\/p>\n<p>Man sieht an diesem Beispiel, wie g\u00fcnstig es ist, mehrere Variablen einzuf\u00fchren, um das Bild etwas \u00fcbersichtlicher zu gestalten.<\/p>\n<p>Achtung! Obwohl es nach einer Endlos-Verschachtelung aussieht \u2014 L ruft R auf und wieder umgekehrt \u2014 l\u00e4uft das Programm trotzdem zu Ende. Es ist vielmehr dem Programmierer \u00fcberlassen eine Abbruchbedingung zu implementieren. So beispielsweise das Abbrechen bei einer bestimmten Schachtlungstiefe oder Stamml\u00e4nge.<\/p>\n<h3>Drachen-Kurve<\/h3>\n<p>Axiom: D<br \/>\nProduktionsregeln: D \u2192\u00a0-D++E<br \/>\nE \u2192\u00a0D&#8211;E+<br \/>\ndelta: 60\u00b0<\/p>\n<h3>B\u00e4ume und B\u00fcsche<\/h3>\n<p>Nachdem wir das Grundsystem kennengelernt haben, d\u00fcrfte es nicht schwerfallen, fraktale Gew\u00e4chse zu entwickeln. Die Frage ist hier nur: Wie kann man eine Struktur, die sich verzweigt in einer Zeichenkette darstellen, die das L\u2014System letztendlich verwendet? Notwendig dazu ist die Einf\u00fchrung zweier Symbole: [ und ]. Gelangt der Turtle bei der Interpretation der Zeichenkette an eine eckige Klammer, so muss er die Position und die Richtung des Turtles sichern und sp\u00e4ter wieder restaurieren. Nun hier ein Beispiel f\u00fcr eine krautartige P\ufb02anze:<\/p>\n<p>Axiom: F<br \/>\nProduktionsregeln: F \u2014&gt; F[+F]F[\u2014F]F<br \/>\ndelta: 25,7\u00b0<\/p>\n<p>und noch ein Kraut:<\/p>\n<p>Axiom: B<br \/>\nProduktionsregeln: F \u2192\u00a0FB<br \/>\nB \u2192\u00a0F[+B]F[\u2014B]+B<br \/>\ndelta: 25,7\u00b0<\/p>\n<p>Bisher waren die vorgestellten Systeme immer deterministisch, das hei\u00dft es gab ein absehbares Ende und eine voraussehbare Form. Wenn der Zufall in ein L-System einzieht, so nennt man dies nicht-deterministisch Systeme stochastisch. Doch wenn der Zufall ein\ufb02ie\u00dft ist eine Aussage \u00fcber das Wachstum schwierig. Dennoch ist es wichtig zu bestimmen wie gro\u00df die Wahrscheinlichkeit sein soll, dass ein Ereignis eintritt. Wenn der Baum z.B. nach rechts driften soll, so kann man Umgangssprachlich sagen: In 2 von drei F\u00e4llen gehe nach rechts. Um dies auszudr\u00fccken erweitern wir die Schreibweise ein wenig, und f\u00fcgen die Wahrscheinlichkeit mit an. Hier das Beispiel von Kraut Nr. 3. (Wahrscheinlichkeit wurde<br \/>\nmit R abgek\u00fcrzt.)<\/p>\n<p>Axiom: F<br \/>\nProduktionsregeln: F \u2192\u00a0F[+F]F[\u2014F]FR 1\/3<br \/>\nF \u2192\u00a0F[+F]FR 1\/3<br \/>\nF \u2192\u00a0F[\u2014F]FR 1\/3<br \/>\ndelta: 25,7\u00b0<\/p>\n<p>Die Anzahl der Produktionsregeln bestimmt also immer den Nenner des Bruches.<\/p>\n<p>Etwas entfernt von der P\ufb02anzen soll abschlie\u00dfend das L-System einer zuf\u00e4lligen Koch-Kurve aufgezeigt werden:<\/p>\n<p>Axiom: F<br \/>\nProduktionsregeln: F \u2192\u00a0F-F++F\u2014FR 0.5<br \/>\nF \u2192 F+F&#8211;F+FR 0.5<br \/>\ndelta: 60\u00b0<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Turtle-Grafik (engl.\u00a0turtle, zu Deutsch Schildkr\u00f6te) ist eine Idee von Seynour Papert, der damit ein Lehrmodell f\u00fcr den Unterricht schaffen wollte. Popul\u00e4r wurde der Turtle sicherlich durch die \u201eKindersprache\u201c LOGO. Aber auch anderswo wurde mit dem Turtle viel gearbeitet. Und so erhielt er viele Namen. Eingef\u00fchrt in der Oberstufe durch einen Roboter (Robi oder so) [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[1],"tags":[],"class_list":["post-2978","post","type-post","status-publish","format-standard","hentry","category-allgemein"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2978","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=2978"}],"version-history":[{"count":3,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2978\/revisions"}],"predecessor-version":[{"id":2981,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/2978\/revisions\/2981"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=2978"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=2978"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=2978"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}