L-Systeme (0L)
Hier ein kleines Python-Skript, um L-Systeme komfortabel
für POV-Ray zu erzeugen. Es erzeugt getrennte
Objekte für die Linienstücke und für
die Verbindungsstellen. Außerdem gibt es
die Gesaamtanzahl der jeweiligen Typen in einer
Variable an und numeriert jedes Teilobjekt durch.
Damit kann man etwa Farbverläufe über
die gesamte Länge bequem definieren.
Das Python-Skript findest Du hier
zum Herunterladen. An seinem Anfang kannst Du
Regeln Deiner Wahl anfügen, an seinem Ende
die notwendigen Einstellungen treffen.
Vorsicht! Beginne mit kleinen Rekursionsanzahlen
(1,2,..) und arbeite Dich langsam so weit wie
nötig nach oben. Die Rechenzeit steigt im
Allgemeinen exponentiell an!
Das Programm erstellt eine include-Datei für
POV-Ray. Lade Dir als Beispiele meine POV-Ray
Skripts für zwei
Dimensionen und drei
Dimensionen herunter. Sie sind fast identisch,
nur braucht die 3D-Version klarerweise eine passende
Drehung des Objektes, da die 2D-Version einfach
senkrecht auf die Kurve herunterblickt.
Das 3D-Skript sieht so aus:
// LSystem test rendering 3D // with shadowless light and some object tweaking camera { location <0,4,0> look_at 0 angle 20 } background { color <0.3,0.4,0.6> } light_source {<2,5,0>,1 shadowless}
// here it comes - the LSystem Object definition
// set radius of line segments #declare r = 0.01;
// plain cylinders build the lines #macro LineObject(a,b,n) cylinder { a,b,r pigment { color rgb 1.2 } }
#end
// red balls as joints
#macro JointObject(a,n)
sphere { a,r*3.5 pigment { color rgb x }} #end
// get the object #include "lsystest.inc"
// show it
object { LSysObject
finish { ambient 0.9 diffuse 0.2 } scale 0.7 rotate <0,0,12> rotate <-10,0,0>
}
hier die hexagonale Gosper-Kurve aus dem Python-Programm:
GRAMMAR3 = {
'Name' : "Hex Gosper",
'Axiom' : 'XF',
'Winkel' : 60,
'X' : 'X+YF++YF-FX--FXFX-YF+',
'Y' : '-FX+YFYF++YF+FX--FX-Y'
}

und hier kommt die dreidimensionale Hilbertkurve
GRAMMAR10 = {
'Axiom' : 'A',
'Winkel' : 90,
'A' : 'B-F+CFC+F-D&F^D-F+&&CFC+F+B//',
'B' : 'A&F^CFB^F^D^^-F-D^|F^B|FC^F^A//',
'C' : '|D^|F^B-F+C^F^A&&FA&F^C+F+B^F^D//',
'D' : '|CFB-F+B|FA&F^A&&FB-F+B|FC//'
}

Im folgenden Bild habe ich die zweidimensionale
Hilbertkurve herangezogen und den Teilobjekten
eine Höhenkomponente entsprechend ihrer Laufnummer,
sowie analog eine Farbe eines Verlaufs zugeordnet.
Das war das Ergebnis:

Über derartige seltsame Kurven kannst Du im
Mathematik-Unterricht mehr erfahren. Hilbert hat
sich 'seine' Kurve 1891 als Beispiel dafür
ausgedacht, dass eine eindimensionale Linie, wenn
man sie nur oft genug faltet und knickt (präzise
gesagt: unendlich oft), eine zweidimensionale
Fläche vollständig füllen kann.
In der Folge zwang das die Mathematiker, den klassischen
Dimensionsbegriff zu überdenken und ganz
neu zu formulieren (Das war so um 1900 herum -
also viel zu modern für unsere Mathe-Lehrpläne...).
In der heute für solche Objekte verwendeten
'fraktalen Ähnlichkeitsdimension' hat eine
Strecke Dimension D=1, das Quadrat Dimension D=2
(so wie gewohnt). Die bekannte Schneeflockenkurve
hat D=1,2619 und liegt dazwischen. Die Hilbertkurve
besitzt den Dimensionswert D=2, was für eine
'klassische' Kurve ganz unmöglich wäre
(keine Sorge - die klassische Mathematik kümmert
sich prinzipiell nicht um derart geknickte Linien
und hat deshalb auch kein Problem mit ihnen).
Die 3D-Hilbertkurve, von der jedes Zwischenstadium
mit fixierter Rekursionstiefe Dimension 1 besitzt,
hat schlussendlich sogar Dimension 3.
|