Hlavní navigace

Knihovna ClanLib (25)

Petr Kavánek

V další části seriálu o knihovně ClanLib budeme pokračovat ještě tak trochu v duchu minulého dílu. Povíme si o další poměrně jednoduché, avšak užitečné třídě, kterou je CL_Quad.

CL_Quad


Tato třída, jak již bylo zmíněno výše, reprezentuje čtyřúhelník. Není tedy divu, že se zadává pomocí čtyř bodů. Přesněji řečeno osmi souřadnicemi těchto čtyř bodů.

Konstruktory vypadají následovně:

CL_Quad(int new_x1, int new_y1,
                 int new_x2, int new_y2,
                 int new_x3, int new_y3,
                 int new_x4, int new_y4);

CL_Quad(const CL_Rect &rect);

CL_Quad(const CL_Quad &q);

Prvnímu konstruktoru tedy předáváme zmíněných osm souřadnic odpovídajících čtyř bodů. Druhému konstruktoru předáváme objekt třídy CL_Rect, což, jak již víme, je obdélník. Vytvořený čtyřúhelník pak odpovídá tomuto obdélníku.

K dispozici je, jak vidíte, i kopírovací konstruktor.

Implicitní konstruktor sice můžete použít také, avšak nedoporučuji to, jedině s vědomím, že proměnné byly inicializovány náhodně.

Pro třídu CL_Quad jsou přetíženy následující operátory:

CL_Quad &operator+=(const CL_Quad &q);
CL_Quad &operator-=(const CL_Quad &q);

CL_Quad &operator+=(const CL_Point &p);
CL_Quad &operator-=(const CL_Point &p);

CL_Quad operator+(const CL_Quad &q) const;
CL_Quad operator-(const CL_Quad &q) const;

CL_Quad operator+(const CL_Point &p) const;
CL_Quad operator-(const CL_Point &p) const;

bool operator==(const CL_Quad &q) const;
bool operator!=(const CL_Quad &q) const;

Následující obrázek znázorňuje význam operátoru +=


Uvažujme následující deklarace:

CL_Quad Obdelnik;
CL_Quad CernyCtyruhelnik;
CL_Quad ZelenyCtyruhelnik;

Potom obrázek vlastně znázorňuje operaci:

ZelenyCtyruhelnik = CernyCtyruhelnik += Obdelnik;

To znamená, že když „CernyCtyruhelnik k sobě přičte Obdelnik“, pak „vznikne ZelenyCtyruhelnik“. Myslím, že z obrázku je docela dobře vidět, jak takovéto sčítání dvou obdélníků funguje. Nutno podotknout, že na místě obdélníku se může vyskytovat obecně libovolný čtyřúhelník.

Operátor -= funguje tak, že šipky mají opačný směr.

Operátory + a – mají stejnou sémantiku jako výše popsané += a -= s tím rozdílem, že nemodifikují původní objekt, ale vracejí objekt nový, jak je to ostatně u těchto operátorů zvykem.

Dosud jsme měli na mysli operátory předefinované pro dva objekty CL_Quad. Jak jste si však jistě v uvedeném výčtu všimli, jsou tyto operátory definovány i pro dvojici CL_Quad, CL_Point. Chovají se pak jako posunutí o vektor z počátku do daného bodu. Jiný pohled je ten, že se chovají jako operátory pro dva čtyřúhelníky, kde druhý z čtyřúhelníků má všechny čtyři body stejné.

Operátor == vrací true v případě, že porovnávané čtyřúhelníky mají všechny odpovídající souřadnice shodné, jinak vrací false. S operátorem != je to přesně naopak.

K souřadnicím se přistupuje přes veřejné proměnné typu int pojmenované postupně x1, y1, x2, y2, x3, y3, x4, y4.

K dispozici máme také následující metody:

int get_width() const;
int get_height() const;

CL_Size get_size() const;

CL_Rect get_bounds();


Metoda get_bounds() vrací nejmenší obdélník (CL_Rect) do nějž se vejde náš čtyřúhelník. Metody get_width() a get_height() vracejí šířku resp. výšku tohoto opsaného obdélníku a metoda get_size() je vrací jako instanci minule popsané třídy CL_Size.

void rotate(const CL_Point &hotspot, float angle);

Metoda rotate() náš čtyřúhelník otočí o úhel angle okolo zadaného bodu hotspot.

void scale(float sx, float sy);
void scale(const CL_Point &hotspot, float sx, float sy);

První z metod scale() vynásobí x-ové souřadnice parametrem sx, y-ové parametrem sy.

To odpovídá tomu, že všechny x-ové složky vektorů vycházející ze středu budou sx-krát zvětšeny. Obdobně y-ové složky. Druhá z metod dělá vlastně totéž, ovšem s vektory vycházejícími z bodu hotspot. Při stejně velkých sx, sy se tomu myslím říká stejnolehlost se středem hotspot (nebo (0, 0) u první z metod).

Závěr

Čtyřúhelníky nejspíš nebudete potřebovat tak často jako obdélníky, ale přesto si myslím, že povědomí o jejich existenci není na škodu, a doufám, že se alespoň některým z vás bude někdy hodit.

Našli jste v článku chybu?