Čo je korytnačia grafika
Doteraz sme do grafickej plochy kreslili príkazmi:
MoveTo(X, Y); LineTo(X, Y); Rectangle(X1, Y1, X2, Y2); Ellipse(X1, Y1, X2, Y2);
Tie pracovali s absolútnymi súradnicami. Dá sa kresliť aj iným - relatívnym spôsobom. Na kreslenie použijeme špeciálne grafické pero - korytnačku. Predstave si korytnačku, ktorá sa prechádza po piesočnatej pláži a v piesku zanecháva stopu. To, čo korytnačka v piesku nakreslí, uvidíme na obrazovke. Korytnačka sa hýbe dopredu a občas sa otočí vľavo alebo vpravo.
Grafickú korytnačku možno:
- otáčať o zadaný uhol smerom vľavo alebo vpravo
- presúvať dopredu o určenú vzdialenosť v smere, v ktorom je práve natočená.
Príklad: Nasledujúce príkazy nakreslia štvorec:
Dopredu(100); // choď dopredu 100 krokov Vlavo(90); // otoč sa vľavo o 90 stupňov Dopredu(100); Vlavo(90); Dopredu(100); Vlavo(90); Dopredu(100);
To isté dosiahneme aj cyklom:
for (int i=0; iWidth/2; Y=Image->Height/2; }
Metóda ZmenSmer nastaví smer korytnačky. Chceme, aby Smer Î :
void TKor::ZmenSmer(float nSmer) { if (Smer==nSmer) return; Smer=nSmer; while (Smer+180) Smer=Smer-360; }
Metóda ZmenXY presunie korytnačku na nové súradnice na obrazovke. Navyše, ak korytnačka kreslí čiary (pero je dolu), ZmenXY nakreslí čiaru do tohto nového bodu:
void TKor::ZmenXY(float nX, float nY) { if (X==nX && Y==nY) return; Image->Canvas->MoveTo(X+0.5, Y+0.5); Image->Canvas->LineTo(nX+0.5, nY+0.5); X=nX; Y=nY; }
V premenných X, Y sú reálne čísla, ale príkazy MoveTo a LineTo pracujú s celými číslami. Ak sa má vykonať LineTo(1.8, 1.1), koniec úsečky bude ležať v bode (1, 1) a nie v bode (2, 1), ktorý je k uvedeným súradniciam "bližšie". Pripočítaním +0.5 získame zaokrúhlené celé číslo (1.8+0.5=2.3 ... po konverzii konverzii =2, zatiaľ čo 1.1+0.5=1.6 ... po konverzii konverzii =1). Pozor, táto "finta" funguje iba pre kladné čísla.
- 4. Nasledujúcimi metódami riadime relatívny pohyb korytnačky:
void TKor::Vlavo(float Uhol) { ZmenSmer(Smer-Uhol); }
void TKor::Vpravo(float Uhol) { ZmenSmer(Smer+Uhol); }
void TKor::Dopredu(float Dlzka) { float a; a=Smer/180*M_PI; ZmenXY(X+Dlzka*sin(a), Y-Dlzka*cos(a)); }
- 5. Korytnačku "naučíme" aj príkazové skratky - napríklad, príkaz Vlavo bude mať skratku vl:
private:
...
public:
... void vl(float Uhol) {Vlavo(Uhol);}; void vp(float Uhol) {Vpravo(Uhol);}; void dp(float Dlzka) {Dopredu(Dlzka);}; };
Programovanie metód priamo v definícii triedy robievame v C++ iba výnimočne a obozretne, pretože tým môžeme skomplikovať čitateľnosť programu.
- 6. V kompletnej knižnici Kor.cpp má trieda TKor nasledujúce vylepšenia:
- metóda ZmenHrubku(int nHrubka) nastaví hrúbku čiary, ktoré korytnačka kreslí;
- metóda ZmenFarbu(TColor nFarba) nastaví farbu čiary
- metóda PeroHore() korytnačka prestane kresliť (až pokým nezavoláme PeroDolu);
- metóda PeroDolu() korytnačka položí pero na papier a pri pohybe bude kresliť čiary;
- metóda Smerom(float aX, float aY) vráti uhol k bodu aX, aY;
- vlastnosť Smer;
- vlastnosti X, Y.
Príklady s korytnačkou
Keď potrebujeme v projekte používať korytnačiu grafiku, skopírujeme súbor Kor.cpp do adresára (priečinku) projektu a kompilátoru oznámime, že používame našu knižnicu Kor.cpp:
#include #pragma hdrstop
#include "Unit.h" #include "Kor.cpp" //-------------------------------------- ---------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1;
//-------------------------------------- ---------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //-------------------------------------- ---------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { TKor k; k.Inic(Image1); int i; for (i=0; i