Übersicht

Verzweigte Strukturen

Demodatei: Demo7.pov

Wie die folgenden Abbildungen belegen, sind variable gerichtete Sphere_Sweeps ideal geeignet, um verzweigte Strukturen aufzubauen. Die Abbildungen zeigen zwei Beispiele einfach verzweigter Strukturen und ein Beispiel für ein Verzweigungsmuster zweiter Ordnung.

Branched structure Branched structure Branched structure

Ganz allgemein werden diese Verzweigungsmuster erzeugt, indem zunächst ein Hauptast einschließlich der entsprechenden Unterpunkte generiert wird. Von diesen Unterpunkten ausgehend, werden dann in einer Schleife die Seitenäste erster Ordnung gebildet. Die Lage der Endpunkte dieser Äste bestimmt maßgeblich die Geometrie der Struktur. Zweige höherer Ordnung müssen dann durch Schleifen innerhalb dieser Schleife für die Zweige erster Ordnung erzeugt werden. Auch bei Ihnen ergeben sich die Startpunkte wiederum aus den Punkten (oder Unterpunkten) der Zweige nächsttieferer Ordnung.
Nachstehend bespreche ich die Programmierung für die Struktur des letzten Bildes. Die dabei verwendeten Makros wurden allesamt in vorhergehenden Kapiteln besprochen und sind in der Demodatei einsehbar

//Initialisierung der pseudo-random streams.
#local chance1 = seed (13);
#local chance2 = seed (15);
#local chance3 = seed (23);

//Der Hauptast

//Zunächst werden die Parameter für den Hauptast definiert.
#declare NumberMain = 12;
#declare PositionsMain = array[NumberMain];
#declare StartMain = <0, 0, 0>;
#declare EndMain = <0, 12, 0>;
#declare VectorMain = EndMain - StartMain;
#declare RadiusMain = 0.01;
#declare DivisionsMain = 2;
#declare VarianceMain = 0.3;

//Dann wird der Array für diesen Hauptast definiert...
Sweep_Regular (StartMain, EndMain, NumberMain, VarianceMain, PositionsMain)

//...und die Positionen aus diesem Array werden verwendet, um den Sphere_Sweep zu zeichnen.
DrawSphereSweepVarRadius (PositionsMain, 0.18, 0.01, NumberMain)

//Die Unterpunkte für den Hauptast.
#declare FinalNumber = (NumberMain - 2) + (NumberMain - 3) * DivisionsMain;
//Anzahl der Punkte des Sphere_Sweeps kombiniert mit der der Unterpunkte.

#declare SubpositionsMain = array[FinalNumber];
//Initialisierung des Arrays für die Unterpunkte.

Subdivisions (PositionsMain, NumberMain-2, DivisionsMain, RadiusMain, SubpositionsMain)

//Seitenäste erster Ordnung.

//Zunächst werden einige Parameter für die Äste definiert.
#declare Angle1 = 0;
#declare Variance1 = VarianceMain*0.6;

//Die folgende Schleife definiert die Seitenäste für alle außer den alleräußersten Unterpunkten des Hauptasts.
#declare ticker1 = 1;
#while (ticker1 < dimension_size(SubpositionsMain, 1)-3)

//Es folgen einige Parameter der Seitenäste erster Ordnung.
#declare Number1 = NumberMain - div(ticker1+10,(DivisionsMain+1)+2);
#declare Positions1 = array[Number1];

//Die Startpositionen der Seitenäste entsprechen den Unterpunkten des Hauptasts.
#declare Start1 = SubpositionsMain[ticker1];

//Die Endpositionen werden in den folgenden Zeilen definiert.

#declare End1 = Start1 + <0.5*vlength(EndMain-Start1) + 0.2 *(rand(chance1) - 0.5), vlength(EndMain-StartMain)/24 + vlength(EndMain-Start1)/3, 0>;
#declare End1 = vaxis_rotate (End1, EndMain-StartMain, Angle1 + 5 *(rand(chance3) - 0.5));

#declare Angle1 = Angle1 + 137.5;
Sweep_Regular (Start1, End1, Number1, Variance1, Positions1) //Hier werden die Arrays für die Äste definiert...

DrawSphereSweepVarRadiusb (Positions1, 0.12, 0.01, Number1) //...und die Positionen aus diesen Arrays werden genutzt,
//um die Sphere_Sweeps zu zeichnen.


#declare Vector1 = End1-Start1;

#if (Number1 >3)

//Unterpunkte fuer die Seitenaeste 1. Ordnung.

#declare Radius1 = 0.01;
#declare Divisions1 = 1;

#declare FinalNumber1 = (Number1 - 2) + (Number1 - 3) * Divisions1; //Anzahl der Punkte des jeweiligen Sphere_Sweeps kombiniert mit der der Unterpunkte.

#declare Subpositions1 = array[FinalNumber1];

Subdivisions (Positions1, Number1-2, Divisions1, Radius1, Subpositions1)

//Seitenäste zweiter Ordnung.

//Zunächst werden einige Parameter definiert...
#declare Angle2 = 0;
#declare Number2 = 5;
#declare Positions2 = array[Number2];
#declare Variance2 = 1;

//Die folgende Schleife definiert die Seitenäste für alle außer den alleräußersten Unterpunkten der Äste erster Ordnung.
#declare ticker2 = 1;
#while (ticker2 < dimension_size(Subpositions1, 1)-1)

//Die Startpositionen für die Äste werden definiert.

#declare Start2 = Subpositions1[ticker2];

//Die Endpositionen der Äste werden definiert.

#declare End2 = 0.3 * (End1 - Start2);
#declare End2 = vrotate (End2, <55 + 5 *(rand(chance3) - 0.5), 0, 0>);
#declare End2 = vaxis_rotate (End2, End1-Start2, Angle2 + 5 *(rand(chance3) - 0.5));
#declare End2 = End2 + Start2;

//Zwei aufeinander folgenden Äste werden um den "Goldenen Winkel" gedreht.
#declare Angle2 = Angle2 + 137.5;

//Dieser Makro definiert die Positionen für die Seitenäste zweiter Ordnung.
Sweep_Regular (Start2, End2, Number2, Variance2/10, Positions2)

//Dieser Makro zeichnet die Seitenäste zweiter Ordnung.
DrawSphereSweepVarRadius (Positions2, 0.08, 0.007, Number2)

#declare ticker2 = ticker2 + 1;
#end
#else
#end
#declare ticker1 = ticker1 + 1;
#end

Übersicht