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

#include "3d.h"
#include "fgrafika3d2.h"
#include <math.h>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
 il_rozwiniec = 0;
}
//---------------------------------------------------------------------------
// Inicjowanie okienka
void __fastcall TForm1::FormShow(TObject *Sender)
{
 odczytaj_parametry();
}
//---------------------------------------------------------------------------
//  Zmieniono nastawę któregoś z elementów interfejsu
void TForm1::odczytaj_parametry( void)
{
 double r, fi, teta;
 int a;
 double k = M_PI / 180.;        //stopnie na radiany

 r = TrackBar1 -> Position;
 fi = TrackBar2 -> Position;
 teta = TrackBar3 -> Position;
 a = RadioGroup1 -> ItemIndex + 1;

 p_obs.x = r * sin( k * teta) * cos( k * fi);
 p_obs.y = r * sin( k * teta) * sin( k * fi);
 p_obs.z = r * cos( k * teta);

 if( a != il_rozwiniec)     //zmieniono poziom rozwijania?
 {
    formula = "UA";         //Jeśli tak, rozwiń od początku
    il_rozwiniec = a;
    for( int i = 0; i < il_rozwiniec; i++)
        rozwin();
 }
}
//---------------------------------------------------------------------------
//  Grafika
void __fastcall TForm1::FormPaint(TObject *Sender)
{
 TPunkt p0(0, 0, 0);        //zaczepienie grafiki
 rysuj( p0, 0, 90, 5);      //interpretacja formuły tekstowej
}
//---------------------------------------------------------------------------
//  Wzrost formuły
void TForm1 :: rozwin( void)
{
 String tmp;
 int i, len = formula.Length();
 char c;

 for( i = 1; i <= len; i ++)
 {
    c = formula[ i];
    switch( c)
    {
     case 'A':
                tmp += "AGLADRADRAGRALALALARA";
                break;
     case 'R':                  //skręć w poziomie w prawo
                tmp += "R";
                break;
     case 'L':                  //skręć w poziomie w lewo
                tmp += "L";
                break;
     case 'G':                  //skręć w pionie w górę
                tmp += "G";
                break;
     case 'D':                  //skręć w pionie w dół
                tmp += "D";
                break;
     case 'U':                  //wprowadź skalowanie wymiaru
                tmp += "UV";
                break;
     case 'V':                  //skaluj wymiar
                tmp += "V";
                break;
    }
 }
 formula = tmp;
 Caption = formula;
}
//---------------------------------------------------------------------------
//  Interpretuj formułę.
void TForm1 :: rysuj( TPunkt p0, double fi, double teta, double dlg)
{
 T3d projektor( p_obs,          //pozycja obserwatora
        0, 0, PaintBox1 -> Width, PaintBox1 -> Height,  //okno ekranowe
        0.3);
 int i, len = formula.Length();
 int xe, ye;
 char c;
 double k = M_PI / 180.;         //stopnie na radiany

 PaintBox1 -> Canvas -> Pen -> Width = 2;
 PaintBox1 -> Canvas -> Pen -> Color = clBlue;
 for( i = 1; i <= len; i ++)
 {
    c = formula[ i];
    switch( c)
    {
     case 'A':
                projektor.punkt_3d( xe, ye, p0);
                PaintBox1 -> Canvas -> MoveTo( xe, ye);
                p0.x = p0.x + dlg*sin(k*teta)*cos(k*fi);
                p0.y = p0.y + dlg*sin(k*teta)*sin(k*fi);
                p0.z = p0.z + dlg*cos(k*teta);
                projektor.punkt_3d( xe, ye, p0);
                PaintBox1 -> Canvas -> LineTo( xe, ye);
                break;
     case 'R':                  //skręć w poziomie w prawo
                fi -= 90;
                break;
     case 'L':                  //skręć w poziomie w lewo
                fi += 90;
                break;
     case 'G':                  //skręć w pionie w górę
                teta -= 90;
                break;
     case 'D':                  //skręć w pionie w dół
                teta += 90;
                break;
     case 'U':                  //wprowadź skalowanie wymiaru
                break;
     case 'V':                  //skaluj wymiar
                dlg /= 3.0;
                break;
    }
 }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
 odczytaj_parametry();
 PaintBox1 -> Refresh();        //odrysuj grafikę
}
//---------------------------------------------------------------------------

