Übersicht

Variable gerichtete Sphere_Sweeps

Demodatei: Demo6.pov

In diesem Kapitel werden wir einen zielgerichteteren Ansatz zur Erzeugung von Sphere_Sweeps einführen. Mit dem hier eingeführten Makro wird es möglich sein, zwei beliebige Punkte über einen Sphere_Sweep zu verbinden. Die Variabilität dieses Sphere_Sweep lässt sich mit Hilfe eines Parameters des Makros kontrollieren. In den folgenden Bildern sehen Sie zwei solche Sphere_Sweeps mit unterschiedlichen Werten der Variabilität. In einem späteren Kapitel werden wir diese Methode verwenden, um komplexere Verzweigungsmuster zu erzeugen, als die bereits eingeführten.

sphere_sweep, low variance sphere_sweep, high variance

Für einige dieser Verzweigungsmuster ist es wichtig, Unterpunkte auf dem erzeugten Sphere_Sweep zu finden. Diese Unterpunkte sollen auf dem Sphere_Sweep zwischen den Definitionspunkten für den Sphere_Sweep liegen (siehe die rot markierten Postionen in der folgenden Abbildung). Der im folgenden kurz eingeführte Makro erlaubt es, solche Positionen zu finden.

sphere_sweep, subpositions

Wir beginnen, indem wir einen Makro definieren, der einen Array mit Punkten für einen Sphere_Sweep zwischen zwei Punkten erzeugt. Als Inputparameter benötigt dieser Makro die Start- und Endposition, (P1 und P2), die Anzahl der definierenden Positionen, die Varianz und den Namen des produzierten Arrays. Dieser Array muss vor dem Aufrufen des Makros initialisiert werden.
Im ersten Abschnitt des Makros werden Start- und Endposition, sowie die beiden äußeren Punkte in den Array geschrieben. Die verbleibenden mittleren Positionen werden zunächst definiert, indem der Vektor zwischen Start- und Endposition regelmäßig unterteilt wird. Anschliessend wird diesen mittleren Positionen ein bestimmtes Maß (Parameter: Variance) zufälliger Varianz hinzugefügt.

#macro Sweep_Regular (P1, P2, Number, Variance, ArrayName)

//Definition von P1 und P2 sowie der äußeren Positionen.
#declare ArrayName[0] = P1 + (1/Number*(P1-P2));
#declare ArrayName[1] = P1;
#declare ArrayName[Number-2] = P2;
#declare ArrayName[Number-1] = P2 + (1/Number*(P2-P1));

//Schleife zur Definition der mittleren Positionen.
#local ticker = 2;
#while (ticker <Number-2)
#declare ArrayName [ticker] = P1 + ((ticker-1)/(Number-3) * (P2-P1)) + <:Variance *(rand(chance1) - 0.5), Variance *(rand(chance2) - 0.5), Variance *(rand(chance3) - 0.5)>;
#local ticker = ticker + 1;
#end
#end

Bevor der beschriebene Makro "Sweep_Regular" aufgerufen werden kann, müssen drei pseudo-random Streams intialisiert werden, sowie der Array, der in dem Makro verwendet wird. Der Makro schreibt dann die erzeugten Koordinaten in diesen Array("Positions"), der im folgenden Makro ("DrawSphereSweep", siehe vorhergehende Kapitel) verwendet werden kann, um den Sphere_Sweep darzustellen.

#declare chance1 = seed (3);
#declare chance2 = seed (6);
#declare chance3 = seed (5);

#declare Sum = 7;
#declare Positions = array[Sum];

Sweep_Regular (<0, 2, 0>, <12, 4, 0>, Sum, 0.5, Positions) //Definition der Positionen.

DrawSphereSweep (Positions, 0.2, Sum) //Zeichnen des Sphere-Sweeps.

Bevor wir zu praktischeren Anwendungen des oben eingeführten Makros kommen, werde ich noch einen anderen Makro kurz vorstellen. Dieser Makro erlaubt es, Punkte auf einem Sphere_Sweep zwischen den definierenden Punkten zu erhalten. Eine solche Aufgabe erscheint bei dem oben abgebildeten Sphere_Sweep mit der Variance = 0.5 relativ einfach, wird aber zunehmend schwieriger bei unregelmäßigeren Sphere_Sweeps. Bei solchen führt eine einfache Teilung der Strecke zwischen zwei Punkten des Sphere_Sweeps lediglich zu Punkten in der Nähe, aber nicht direkt auf dem Sphere_Sweep. Der Makro Subdivisions beginnt mit solchen Punkte und sucht dann die nächstgelegenen Punkte auf dem jeweiligen Sphere_Sweep. In einem zweiten Schritt versucht er dann, den jeweiligen Punkt genau in die Mitte des Sphere_Sweeps zu platzieren. Da der Makro relativ umfangreich ist, würde eine entsprechende Darstellung hier zuviel Platz einnehmen. Die genaue Formulierung ist in der entsprechenden Demodatei einzusehen.

#macro Subdivisions (InputArray, PositionNumber, DivisionNumber, SweepRadius, OutputArray) //Dieser Makro sucht nach Unterteilungen bei einem Sphere_Sweep.

//InputArray entspricht dem Array mit den Positionen für den Sphere_Sweep.
//PositionNumber entspricht der Anzahl der Positionen die Bestandteil des Sphere_Sweeps sind
//(d.h., der Anzahl der im Array gespeicherten Positionen - 2).
//Kleinere Werte für PositionNumber führen dazu, dass nur für einen Teil des Sphere_Sweeps Unterpunkte gesucht werden.
//DivisionNumber entspricht der Anzahl neuer Unterpunkte zwischen zwei Punkten des Sphere_Sweeps.
//SweepRadius entspricht dem Radius des Sphere_Sweeps. (Und dieser Radius entscheidet, wie genau die Unterpunkte
//in der Mitte des Sphere_Sweeps platziert werden.)
//OutputArray entspricht dem Namen des Outputarrays. Dieser Array wird die alten, wie auch die neuen Positionen des Sphere_Sweeps enthalten.

Übersicht