An den Kanten bzw. können nun weitere ``Äste'' als Polygone angesetzt werden, die bzgl. des gegebenen Polygons mit 0.75 bzw. 0.47 skaliert sind. Durch wiederholtes Anstückeln entsteht ein Baum mit immer feinerer Verästelung. Statt dieses deterministischen Verfahrens kann man z.B. die Lage des Punktes C von einem Zufallsparameter beeinflussen lassen.
Vom Baum-Algorithmus erzeugter Baum mit 11, 47 bzw. 3071 Polygonpunkten
/*****************************************************************************/
/* */
/* Baum */
/* */
/*****************************************************************************/
public void baum() // wendet eine Iteration auf die Ansatzstuecke an
//Point ansatz[], // alte und neue Folge von Ansatzstuecken
//int anzahl, // Anzahl der Anzsatzstueckendpunkte
//Point poly_punkt[], // alte und neue Folge von Polygonecken
//int poly_point_cnt // Anzahl der Polygonecken
{
int i,j,k,p;
double a,b,l,si_de,co_de;
Point P;
Point Q;
Point A;
Point B;
Point C;
Point[] ast = new Point[3];
Point[] Hpunkt = new Point[MAX_POINTS];
Point[] Hansatz = new Point[MAX_POINTS];
DoublePoint[] schema = new DoublePoint[3];
ast[0] = new Point();
ast[1] = new Point();
ast[2] = new Point();
schema[0] = new DoublePoint();
schema[1] = new DoublePoint();
schema[2] = new DoublePoint();
schema[0].x = 0.0; // generiere Schema
schema[0].y = 2.0;
schema[1].x = 2.0/3.0;
schema[1].y = 7.0/3.0;
schema[2].x = 1.0;
schema[2].y = 2.0;
j=0; // Index fuer neue Ansatzstuecke
k=0; // Index fuer neue Polygonpunkte
for (p=0; p<anzahl; p=p+2)
{
P = ansatz[p];
Q = ansatz[p+1];
a = P.y - Q.y; // bestimme l, sinus, cosinus
b = Q.x - P.x;
l = Math.sqrt(a*a + b*b);
si_de = a/l;
co_de = b/l;
for (i=0; i<3; i++) // fuehre Skalierung und Rotation aus
{
ast[i].x = P.x + (int)(l*schema[i].x*co_de-l*schema[i].y*si_de);
ast[i].y = P.y - (int)(l*schema[i].y*co_de+l*schema[i].x*si_de);
}
A = ast[0]; // kreiere neue Ast-Punkte
B = ast[1];
C = ast[2];
if (anzahl>2) del_line(P, Q); // loesche Ansatzstueck
set_line(P,A); // zeichne Figur P,A,B,C,Q
set_line(A,B);
set_line(B,C);
set_line(C,Q);
// speichere neue Ansatzstuecke
Hansatz[j] = new Point(A);
Hansatz[j+1] = new Point(B);
Hansatz[j+2] = new Point(B);
Hansatz[j+3] = new Point(C);
j=j+4;
}
i=0; // Index fuer altes Polygon
k=0; // Index fuer neues Polygon
for (p=0; p<anzahl; p=p+2) // Index fuer alte Ansatzstuecke
{
while ((poly_punkt[i].x !=ansatz[p].x) ||
(poly_punkt[i].y !=ansatz[p].y))
// uebernimm unveraenderte Polygonpkte
Hpunkt[k++] = poly_punkt[i++];
Hpunkt[k] = ansatz[p]; // uebernimm neue Polygonpunke
Hpunkt[k+1] = Hansatz[2*p];
Hpunkt[k+2] = Hansatz[2*p+1];
Hpunkt[k+3] = Hansatz[2*p+3];
Hpunkt[k+4] = ansatz[p+1];
k+=4;
i++;
}
while (i<poly_point_cnt) Hpunkt[k++]=poly_punkt[i++];
for (i=0; i<j; i++)
ansatz[i] = Hansatz[i]; // neu berechnete Ansatzstuecke kopieren
anzahl=j;
for (i=0; i<k; i++)
poly_punkt[i] = Hpunkt[i]; // neu berechnete Polygonpunkte kopieren
poly_point_cnt=k;
}