algorytm.org

Implementacja w C/C++



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

L-systemy - Implementacja w C/C++
Ocena użytkownikóww: *****  / 3
SłabyŚwietny
Nadesłany przez Tomasz Lubiński, 27 lipca 2005 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

L-systemy - program/Unit1.cpp:
//www.algorytm.org
//Tomasz Lubiński (c)2003
//L-systemy

#include <vcl.h>
#include <math.h>
#include <vector.h>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner){}



void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString produkcja,tmp;
AnsiString reguly[10];
int dlugosc,flaga,iteracji;
float kat,krok,przyrost_kat;
float dx,dy,x,y;
vector<int> stos_x, stos_y;
vector<float> stos_kat;

//zebranie danych z formularza
produkcja=Memo1->Lines->operator [](0);
for(int i=1; i<Memo1->Lines->Count; i++) reguly[i-1]=Memo1->Lines->operator [](i);
przyrost_kat=StrToFloat(LabeledEdit1->Text);
krok=StrToFloat(LabeledEdit2->Text);
iteracji=StrToInt(LabeledEdit3->Text);

//ustawienia początkowe (x,y - punkt startowy rysowania, kat - kąt początkowy, dx,dy-przesuniecia)
kat=0;
x=StrToInt(startX->Text);
y=Image1->Height-StrToInt(startY->Text);
dx=krok*cos(M_PI*kat/180);
dy=krok*sin(M_PI*kat/180);

//przygotowanie rysunku
Image1->Canvas->Rectangle(0,0,Image1->Width,Image1->Height);
Image1->Canvas->MoveTo(x,y);

//etap przetwarzania regul
for (int i=0; i<iteracji; i++)
        {
        dlugosc=produkcja.Length();
        tmp=produkcja;
        produkcja="";
        for (int j=1; j<=dlugosc; j++)
                        {
                        flaga=0;
                        for (int k=0; k<Memo1->Lines->Count-1; k++)
                        if (reguly[k][1]==tmp[j])
                                {
                                flaga=1;
                                produkcja=produkcja+reguly[k].SubString(4,reguly[k].Length()-3);
                                break;
                                }
                        if (flaga==0) produkcja=produkcja+tmp[j];
                        }
        }

//etap rysowania
dlugosc=produkcja.Length();
for (int j=1; j<=dlugosc; j++)
        switch (produkcja[j])
                {
                case 'F' : x+=dx;
                           y+=dy;
                           Image1->Canvas->LineTo(x,y);
                           break;
                case 'f' : x+=dx;
                           y+=dy;
                           Image1->Canvas->MoveTo(x,y);
                           break;
                case '+' : kat+=przyrost_kat;
                           dx=krok*cos(M_PI*kat/180);
                           dy=krok*sin(M_PI*kat/180);
                           break;
                case '-' : kat-=przyrost_kat;
                           dx=krok*cos(M_PI*kat/180);
                           dy=krok*sin(M_PI*kat/180);
                           break;
                case '[' : stos_x.push_back(x);
                           stos_y.push_back(y);
                           stos_kat.push_back(kat);
                           break;
                case ']' : x=stos_x.back();
                           y=stos_y.back();
                           kat=stos_kat.back();
                           stos_x.pop_back();
                           stos_y.pop_back();
                           stos_kat.pop_back();
                           Image1->Canvas->MoveTo(x,y);
                           break;
                default  : break;
                }
}
//---------------------------------------------------------------------------
//gotowe przyklady
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
switch (ComboBox1->ItemIndex)
{
        case 0: //trojkat Sierpinskiego
        Memo1->Text="F+F+F";
        Memo1->Lines->Add("F: F+F-F-F+F");
        LabeledEdit1->Text="120";
        LabeledEdit2->Text="5";
        LabeledEdit3->Text="5";
        startX->Text = 120;
        startY->Text = 250;
        break;
        case 1:  //platek sniegu Kocha
        Memo1->Text="F++F++F";
        Memo1->Lines->Add("F: F-F++F-F");
        LabeledEdit1->Text="60";
        LabeledEdit2->Text="1";
        LabeledEdit3->Text="5";
        startX->Text = 75;
        startY->Text = 300;
        break;
        case 2:  //krzywa Kocha 1
        Memo1->Text="F";
        Memo1->Lines->Add("F: F+F--F+F");
        LabeledEdit1->Text="60";
        LabeledEdit2->Text="1";
        LabeledEdit3->Text="5";
        startX->Text = 75;
        startY->Text = 300;
        break;
        case 3:  //krzywa Kocha 2
        Memo1->Text="F+F+F+F";
        Memo1->Lines->Add("F: FF+F+F+F+F+F-F");
        LabeledEdit1->Text="90";
        LabeledEdit2->Text="1";
        LabeledEdit3->Text="4";
        startX->Text = 250;
        startY->Text = 300;
        break;
        case 4:  //krzywa Kocha 3
        Memo1->Text="F+F+F+F";
        Memo1->Lines->Add("F: FF+F++F+F");
        LabeledEdit1->Text="90";
        LabeledEdit2->Text="0,8";
        LabeledEdit3->Text="5";
        startX->Text = 100;
        startY->Text = 300;
        break;
        case 5: //krzywa Kocha 4
        Memo1->Text="F+F+F+F";
        Memo1->Lines->Add("F: FF+F+F+F+FF");
        LabeledEdit1->Text="90";
        LabeledEdit2->Text="2";
        LabeledEdit3->Text="4";
        startX->Text = 100;
        startY->Text = 300;
        break;
        case 6: //krzywa Hilberta
        Memo1->Text="X";
        Memo1->Lines->Add("X: -YF+XFX+FY-");
        Memo1->Lines->Add("Y: +XF-YFY-FX+");
        LabeledEdit1->Text="90";
        LabeledEdit2->Text="3";
        LabeledEdit3->Text="5";
        startX->Text = 150;
        startY->Text = 200;
        break;
        case 7: //krzywa Peano
        Memo1->Text="X";
        Memo1->Lines->Add("X: XFYFX+F+YFXFY-F-XFYFX");
        Memo1->Lines->Add("Y: YFXFY-F-XFYFX+F+YFXFY");
        LabeledEdit1->Text="90";
        LabeledEdit2->Text="2";
        LabeledEdit3->Text="4";
        startX->Text = 120;
        startY->Text = 250;
        break;
        case 8: //krzywa Moor'a
        Memo1->Text="LFL+F+LFL";
        Memo1->Lines->Add("L: -RF+LFL+FR-");
        Memo1->Lines->Add("R: +LF-RFR-FL+");
        LabeledEdit1->Text="90";
        LabeledEdit2->Text="3";
        LabeledEdit3->Text="5";
        startX->Text = 100;
        startY->Text = 230;
        break;
        case 9: //Smoka Heighway'a
        Memo1->Text="Fl";
        Memo1->Lines->Add("l: l+rF+");
        Memo1->Lines->Add("r: -Fl-r");
        LabeledEdit1->Text="90";
        LabeledEdit2->Text="1";
        LabeledEdit3->Text="13";
        startX->Text = 200;
        startY->Text = 230;
        break;
        case 10: //Smok Levy'ego
        Memo1->Text="F";
        Memo1->Lines->Add("F: +F--F+");
        LabeledEdit1->Text="45";
        LabeledEdit2->Text="1";
        LabeledEdit3->Text="13";
        startX->Text = 170;
        startY->Text = 230;
        break;
        case 11: //spirala 
        Memo1->Text="AAAA";
        Memo1->Lines->Add("A: X+X+X+X+X+X+");
        Memo1->Lines->Add("X: [F+F+F+F[---X-Y]+++++F++++++++F-F-F-F]");
        Memo1->Lines->Add("Y: [F+F+F+F[---Y]+++++F++++++++F-F-F-F]");
        LabeledEdit1->Text="15";
        LabeledEdit2->Text="6";
        LabeledEdit3->Text="6";
        startX->Text = 200;
        startY->Text = 250;
        break;
        case 12: //pentadendryt
        Memo1->Text="F";
        Memo1->Lines->Add("F: F+F-F--F+F+F");
        LabeledEdit1->Text="72";
        LabeledEdit2->Text="3";
        LabeledEdit3->Text="4";
        startX->Text = 120;
        startY->Text = 150;
        break;
        case 13: //drzewko 1
        Memo1->Text="F";
        Memo1->Lines->Add("F: F[+F]F[-F]F");
        LabeledEdit1->Text="25,7";
        LabeledEdit2->Text="2";
        LabeledEdit3->Text="5";
        startX->Text = 50;
        startY->Text = 100;
        break;
        case 14: //drzewko 2
        Memo1->Text="----F";
        Memo1->Lines->Add("F: FF+[+F-F-F]-[-F+F+F]");
        LabeledEdit1->Text="22,5";
        LabeledEdit2->Text="3";
        LabeledEdit3->Text="4";
        startX->Text = 150;
        startY->Text = 200;
        break;
        case 15: //drzewko 3
        Memo1->Text="X";
        Memo1->Lines->Add("X: F[+X]F[-X]+X");
        Memo1->Lines->Add("F: FF");
        LabeledEdit1->Text="20";
        LabeledEdit2->Text="1";
        LabeledEdit3->Text="7";
        startX->Text = 150;
        startY->Text = 200;
        break;

}
}
//---------------------------------------------------------------------------

Dodaj komentarz