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.