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?
Podnikatel.cz: V restauraci bez cigaret? Sněmovna kývla

V restauraci bez cigaret? Sněmovna kývla

120na80.cz: 5 nejčastějších mýtů o kondomech

5 nejčastějších mýtů o kondomech

DigiZone.cz: Je tu první sportovní přenos přes mobily

Je tu první sportovní přenos přes mobily

Vitalia.cz: Taky věříte na pravidlo 5 sekund?

Taky věříte na pravidlo 5 sekund?

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Měšec.cz: U levneELEKTRO.cz už reklamaci nevyřídíte

U levneELEKTRO.cz už reklamaci nevyřídíte

Vitalia.cz: Mondelez stahuje rizikovou čokoládu Milka

Mondelez stahuje rizikovou čokoládu Milka

Vitalia.cz: Jmenuje se Janina a žije bez cukru

Jmenuje se Janina a žije bez cukru

Vitalia.cz: Pamlsková vyhláška bude platit jen na základkách

Pamlsková vyhláška bude platit jen na základkách

Podnikatel.cz: Udávání kvůli EET začalo

Udávání kvůli EET začalo

120na80.cz: Na ucho teplý, nebo studený obklad?

Na ucho teplý, nebo studený obklad?

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Vitalia.cz: Proč vás každý zubař posílá na dentální hygienu

Proč vás každý zubař posílá na dentální hygienu

Podnikatel.cz: Chtějte údaje k dani z nemovitostí do mailu

Chtějte údaje k dani z nemovitostí do mailu

Vitalia.cz: Nejlepší obranou při nachlazení je útok

Nejlepší obranou při nachlazení je útok

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Root.cz: Certifikáty zadarmo jsou horší než za peníze?

Certifikáty zadarmo jsou horší než za peníze?

Vitalia.cz: Jsou čajové sáčky toxické?

Jsou čajové sáčky toxické?

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA