/p>
V príkladoch:
- kreslíme do grafickej plochy Image1
* potrebujeme globálne premenné:
TCanvas *g; // grafická plocha int StredX, StredY; // stred plochy
- používame časovač Timer1 s hodnotou Interval=50,
- používame matematické funkcie - nezabudnúť na: #include
Bod v 3d
Definujeme triedu TBod. Objekt tejto triedy si:
- pamätá súradnice bodu v priestore,
- má metódy, pomocou ktorý môžeme bod posúvať a otáčať okolo osí x, y, alebo z,
- má metódu, pomocou ktorej zistíme jeho súradnice v grafickej ploche Image1 (t.j. jeho priemet v dvojrozmernej rovine).
class TBod {
public:
float X, Y, Z; TBod(); TBod(float nX, float nY, float nZ); void Posun(float dX, float dY, float dZ); void OtocX(float U); void OtocY(float U); void OtocZ(float U); TPoint Priemet(); };
TBod::TBod() { X=0; Y=0; Z=0; }
TBod::TBod(float nX, float nY, float nZ) { X=nX; Y=nY; Z=nZ; }
void TBod::Posun(float dX, float dY, float dZ) { X=X+dX; Y=Y+dY; Z=Z+dZ; }
void TBod::OtocX(float U) { float nY, nZ; nY=Y*cos(U)-Z*sin(U); nZ=Y*sin(U)+Z*cos(U); Y=nY; Z=nZ; }
void TBod::OtocY(float U) { float nZ, nX; nZ=Z*cos(U)-X*sin(U); nX=Z*sin(U)+X*cos(U); Z=nZ; X=nX; }
void TBod::OtocZ(float U) { float nX, nY; nX=X*cos(U)-Y*sin(U); nY=X*sin(U)+Y*cos(U); X=nX; Y=nY; }
TPoint TBod::Priemet() { TPoint pom; pom.x=StredX+X; pom.y=StredY-Y; return pom; }
Ukážka použitia:
TBod b(50, 100, 0);
void __fastcall TForm1::Timer1Timer(TObject *Sender) { TPoint p; g->FillRect(Image1->ClientRect); b.OtocZ(0.01); p=b.Priemet(); g->Ellipse(p.x-5, p.y-5, p.x+5, p.y+5); }
Drôtený model
Trieda TUtvar nám umožní zobrazovať drôtené modely geometrických útvarov (t.j. hrany geometrických útvarov): struct TUsecka { TBod A, B; };
class TUtvar {
private:
TUsecka *U; int poc;
public:
TUtvar(); ~TUtvar(); void Pridaj(TBod A, TBod B); void Posun(float dX, float dY, float dZ); void Otoc(float oX, float oY, float oZ); void Kresli(); };
TUtvar::TUtvar() { U=NULL; poc=0; }
TUtvar::~TUtvar() { delete[] U; }
void TUtvar::Pridaj(TBod A, TBod B) { TUsecka *N; int i; N=new TUsecka[poc+1]; for (i=0; iClientRect); Troj.Otoc(0, 0, 0.1); Troj.Kresli(); }
Zápis TBod(0, 0, 0) spôsobí, že v pamäti vznikne dočasne objekt typu TBod, tento objekt sa použije ako parameter funkcie a po skončení volania objekt automaticky zanikne.
Perspektívne premietanie
Skúsime sa pozrieť ešte na jeden geometrický útvar - kocku:
TUtvar Kocka;
void __fastcall TForm1::FormCreate(TObject *Sender) {
// predná strana:
Kocka.Pridaj(TBod( -100, -100, -100), TBod( -100, +100, -100)); Kocka.Pridaj(TBod( -100, +100, -100), TBod( +100, +100, -100)); Kocka.Pridaj(TBod( +100, +100, -100), TBod( +100, -100, -100)); Kocka.Pridaj(TBod( +100, -100, -100), TBod( -100, -100, -100));
// zadná strana:
Kocka.Pridaj(TBod( -100, -100, +100), TBod( -100, +100, +100)); Kocka.Pridaj(TBod( -100, +100, +100), TBod( +100, +100, +100)); Kocka.Pridaj(TBod( +100, +100, +100), TBod( +100, -100, +100)); Kocka.Pridaj(TBod( +100, -100, +100), TBod( -100, -100, +100));
// boky:
Kocka.Pridaj(TBod( -100, -100, -100), TBod( -100, -100, +100)); Kocka.Pridaj(TBod( -100, +100, -100), TBod( -100, +100, +100)); Kocka.Pridaj(TBod( +100, +100, -100), TBod( +100, +100, +100)); Kocka.Pridaj(TBod( +100, -100, -100), TBod( +100, -100, +100)); }
void __fastcall TForm1::Timer1Timer(TObject *Sender) { g->FillRect(Image1->ClientRect); Kocka.Otoc(0, 0, 0.01); Kocka.Kresli(); }
V predchádzajúcom príklade uvidíme namiesto rotujúcej kocky otáčajúci sa štvorec. Je to preto, lebo v metóde TBod::Priemet používame kolmé premietanie a ignorujeme z-ovú súradnicu. Tým strácame informáciu o hĺbke. Namiesto kolmého radšej používame perspektívne premietanie. Upravíme metódu TBod::Priemet(): TPoint TBod::Priemet() { const POZ=500; TPoint pom; pom.x=StredX+X*POZ/(POZ+Z); pom.y=StredY-Y*POZ/(POZ+Z); return pom; }
program na ukážku
Zhrnutie
- zadefinovali sme triedu TBod, ktorá umožnila manipulovať s bodmi v trojrozmernom priestore,
- zoznam úsečiek sme udržiavali v triede TUtvar,
- vytvorili sme jednoduchý otáčajúci sa útvar a zobrazili sme ho na obrazovke v perspektívnom premietaní.