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

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

 POZYCJA = 0;               //inicjowanie algorytmu rysuj()

 rozwin();
 POZYCJA = 0;
 rysuj( 50, y0, 90, dlg/3);

 rozwin();
 POZYCJA = 0;
 rysuj( 200, y0, 90, dlg/7);

 rozwin();
 POZYCJA = 0;
 rysuj( 350, y0, 90, dlg/15);

 rozwin();
 POZYCJA = 0;
 rysuj( 500, y0, 90, dlg/29);
}
//---------------------------------------------------------------------------
//  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 = 45;              //modyfikacja kąta odrostu
 double k = M_PI / 180.;        //stopnie na radiany

 Canvas -> Pen -> Width = 2;
 while( POZYCJA < len)
 {
    c = formula[ ++POZYCJA];
    switch( c)
    {
     case 'A':                  //wykreśl odcinek biały
                Canvas -> Pen -> Color = clWhite;
                Canvas -> MoveTo( x0, ClientHeight-y0);
                x0 += dlg * cos( k * kat);
                y0 += dlg * sin( k * kat);
                Canvas -> LineTo( x0, ClientHeight-y0);
                break;
     case 'B':                  //wykreśl odcinek czarny
                Canvas -> Pen -> Color = clBlack;
                Canvas -> MoveTo( x0, ClientHeight-y0);
                x0 += dlg * cos( k * kat);
                y0 += dlg * sin( k * kat);
                Canvas -> LineTo( x0, ClientHeight-y0);
                break;
     case '(':                  //odrost
                dkat = -dkat;   //raz w lewo, raz w prawo ...
                rysuj( x0, y0, kat + dkat, dlg);
                break;
     case ')':                  //koniec odrostu
                return;     
    }
 }
 return;
}
//---------------------------------------------------------------------------

