//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "fLsystem5.h"
#include <math.h>
#include <stdlib.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
 formula = "A";             //inicjowanie formuły

 rozwin();
 rozwin();
 rozwin();
 rozwin();
 rozwin();
 POZYCJA = 0;               //inicjowanie algorytmu rysuj()
 rysuj( 150, 10, 95, 9);
 POZYCJA = 0;               //inicjowanie algorytmu rysuj()
 rysuj( 150, 10, 91, 8);
 POZYCJA = 0;               //inicjowanie algorytmu rysuj()
 rysuj( 150, 10, 70, 7);
}
//---------------------------------------------------------------------------
//  Wzrost rośliny
void TForm1 :: rozwin( void)
{
 String tmp;
 int i, dlg = formula.Length();
 char c;

 for( i = 1; i <= dlg; i ++)
 {
    c = formula[ i];
    switch( c)
    {
     case 'A':              //gałązka typu A
                tmp += "B(A)B(A)A";
                break;
     case 'B':              //gałązka typu B
                tmp += "BB";
                break;
     case '(':              //boczny odrost
                tmp += "(";
                break;
     case ')':              //koniec odrostu
                tmp += ")";
                break;
    }
 }
 formula = tmp;
}
//---------------------------------------------------------------------------
//  Interpretuj formułę, począwszy od pozycji POZYCJA.
//  Uwaga: bywa, że ta funkcja wywołuje samą siebie.
//  Wtedy kluczowe znaczenie ma zewnętrzna zmienna POZYCJA ...
void TForm1 :: rysuj( double x0, double y0, double kat, double dlg)
{
 int len = formula.Length();
 char c;
 double dkat, ddlg;             //zmodyfikowane parametry funkcji
 double dkatodrostu = random(90); //losowa modyfikacja kąta odrostu
 double k = M_PI / 180.;        //stopnie na radiany

 while( POZYCJA < len)
 {
    c = formula[ ++POZYCJA];
    dkat = kat+(random(40)-20); //losowa modyfikacja kąta wyrastania
    ddlg = random(100*dlg)/100.0; //losowa modyfikacja długości
   switch( c)
    {
     case 'A':                  //wykreśl odcinek biały
                Canvas -> Pen -> Width = 2;
                Canvas -> Pen -> Color = clWhite;
                Canvas -> MoveTo( x0, ClientHeight-y0);
                x0 += ddlg * cos( k * dkat);
                y0 += ddlg * sin( k * dkat);
                Canvas -> LineTo( x0, ClientHeight-y0);
                Canvas -> Pixels[x0][ClientHeight-y0] = clBlue;
                break;
     case 'B':                  //wykreśl odcinek czarny
                Canvas -> Pen -> Width = 1;
                Canvas -> Pen -> Color = clGreen;
                Canvas -> MoveTo( x0, ClientHeight-y0);
                x0 += ddlg * cos( k * dkat);
                y0 += ddlg * sin( k * dkat);
                Canvas -> LineTo( x0, ClientHeight-y0);
                Canvas -> Pixels[x0][ClientHeight-y0] = clRed;
                break;
     case '(':                  //odrost
                dkatodrostu = -dkatodrostu;   //raz w lewo, raz w prawo ...
                rysuj( x0, y0, dkat + dkatodrostu, dlg);
                break;
     case ')':                  //koniec odrostu
                return;
    }
 }
 return;
}
//---------------------------------------------------------------------------

