Die Lindenmayer-Systeme?
Da findest du viel im Internet, einfach googlen, ich hab die
Theorie im Buch
"Natur als fraktale Grafik-stochastische Fraktale und Linden-
mayer-Systeme, programmiert in Turbo Pascal" von Scholl/Pfeiffer (1991)
Markt und Technik-Verlag
nachgelesen, hatte mir das bei EBUY ersteigert.
Dort war ein rekursives Ersetzungssystem für das L-System beschrieben,
das funktionierte aber nicht richtig, bzw. war zu fehleranfällig, deshalb
entwickelte ich eine eigene Methode.
Außerdem war die Darstellung im Buch nur 2D, es gab aber die Anregung,
die L-Systeme in die 3. Dimension zu erweitern.
Ich wollte mich schon selbst an die Arbeit machen (Raytracing), hörte
dann aber von POVRAY, probierte und befand für "best raytracing tool in
universe", so ist dann die UNIT entstanden!
Oder die Unit?
Die Idee, die dahintersteckt, ist ganz einfach:
Im 2D-Lindenmayer-System werden Pflanzen durch STRICHE gezeichnet.
In 3D müssen es also 3D-Striche sein, also entweder Rechtecke oder
Zylinder, im Buch gab es die Anregung, mit Zylindern zu arbeiten, wes-
halb ich hier auch Zylinder verwende.
Zur Vorgehensweise:
Zuerst wird das L-System in einem Puffer erzeugt.
Anschließend wird das System von einer "Turtle-Virtual-Machine"
interpretiert, die eben keine Linien zeichnet (wie eine normale Turtle)
sondern die Positionen, die "bezeichnet" werden sollen, in ein POV-
Korrdinatensystem konvertiert und anschließend das POV-Script in
SDL erzeugt, welches die Voreinstellungen für Kamera, Licht,... ent-
hält und natürlich die "cylinder"-Befehle für das L-Fraktal.
Beispiel gefällig?
Code: Alles auswählen
{$M $FFF0,$0000,$2FF61} {COMPILEREINSTELLUNGEN FÜR MAX. PUFFER}
Program POVDEMO2;
Uses XPOVRAY;
Const PATH = 'C:\TEST\';
Const FILENAME = 'C:\XPOV\POVDEMO2.POV';
Var FarbPalette:POV_TDACPalette256;
LSys:Array[1..2] Of POV_TLindenmayerSystem;
Procedure FARBVERLAUF(a, r1, g1, b1, b, r2, g2, b2:Byte; Var Palette:POV_TDACPalette256);
Var blue, green, red:Byte;
i, nr:Integer;
Begin
nr := (b-a);
For i := 0 To nr Do
Begin
If (nr > 0) Then
Begin
red := (((r1*(nr-i))+(r2*i)) div nr);
green := (((g1*(nr-i))+(g2*i)) div nr);
blue := (((b1*(nr-i))+(b2*i)) div nr);
End;
Palette[(a+i),0] := (red shr 2);
Palette[(a+i),1] := (green shr 2);
Palette[(a+i),2] := (blue shr 2);
End;
End;
Begin
FARBVERLAUF(100,144,124,114,110,0,214,0,FarbPalette);
{FARBVERLAUF erzeugen, von braun nach grün}
LSys[1].RuleName := 'X';
LSys[1].Rule := 'F[+X][-X]FX';
LSys[2].RuleName := 'F';
LSys[2].Rule := 'FF';
{Lindenmayer-System}
SetPOVRAYPath(PATH);
SetPOVRAYResolution(800,600);
ConvertLindenmayerSystemToPOVRAYScript(FILENAME,'X',LSys,36,270,1.4,8,
Round(POVRAY_MAXX/2),
Round(POVRAY_MAXY-4),
(POVRAY_MAXX/2),
((POVRAY_MAXY)-(POVRAY_MAXY/4)),
(-3),
(POVRAY_MAXX/2),
(POVRAY_MAXY/2),
10,
128,
16,224,
True,
140,224,255,
FarbPalette,100,110,
27,10,
0,0,5,
POVRAY_MAXX,0,5,True);
{Konvertierung}
End.
Keine Ursache, ich hab noch jede Menge Codes, aber in PB is damitalso, auf jeden Fall erstmal thnx for sharing.
nicht viel wenn man aus der Pascal-Fraktion kommt, also, nicht falsch
verstehen, ich bin keiner, der nur zum Labern ins Forum kommt, aber
mit PB kenn ich mich noch nicht richtig aus (hab auch gar keine Zeit,
momentan) und bevor ich in PB einsteige, will ich meine PC-DOS-
Projekte abschließen, obwohl es eigentlich sinnlos ist, weil:
"Who still uses f*****g PC-DOS?"
Ich häng' nunmal irgendwie in der Vergangenheit fest und sehe nicht
ein, dass ich das aufgeben soll.