Domáca úloha č. 2: Objektová hierarchia pre grafické objekty

  • Úloha zadaná: 3. 10. 2014
  • Odovzdávanie naostro možné od: 8. 10. 2014
  • Absolútny koniec odovzdávania: 21. 10. 2014
  • Odovzdávate súbory: circle.h, circle.cpp, color.h, color.cpp, ellipse.h, ellipse.cpp, geometry2d.h, geometry2d.cpp, point.h, point.cpp, rectangle.h, rectangle.cpp, vector2d.h, vector2d.cpp

Doplnenie zadania (zobrazené podčiarknuto):

  • 6.10. - príklady SVG tagov vysadené ako code
  • 30.11. - doplnené riešenie

Predstavenie úlohy

V tejto úlohe si precvičíme objektovo-orientovaný návrh na jednoduchej hierarchii grafických objektov. Kostra, ktorú v tejto úlohe vytvoríte, môže byť základom pre ďalšie aplikácie. Príkladom využitia je napríklad primitívne SVG kreslítko.

Zadanie

Vašou úlohou bude implementovať nasledujúcu hierarchiu.

Základným prvkom je abstraktná trieda Geometry2D, reprezentujúca všeobecný 2D grafický objekt. Každý 2D grafický objekt leží na určitej pozícii a má určitú farbu. V tejto úlohe rozlíšime 3 typy objektov - kruh (trieda Circle), elipsu (trieda Ellipse) a obdĺžnik (trieda Rectangle). Nezávisle na type objektu môžme pre každý zistiť jeho pozíciu, farbu, obsah, vypísať si informácie o objekte a tiež zodpovedajúcu SVG značku.

Pozícia objektu je daná 2D bodom (trieda Point). Meniť polohu bodu je možné posunutím podľa istého vektoru (trieda Vector2D).

Farba objektu je daná triedou Color. Farby v triede Color budú zadané v RGB farebnom priestore. Špecifikovať farbu bude možné po zložkách, alebo pomocou hexadecimálneho kódu.

Požiadavky

Trieda Point

Point();
  • bezparametrický konštruktor, nastaví pozíciu na počiatok súradnicovej sústavy (0,0)
Point(int x, int y);
  • nastaví pozíciu na dané súradnice
void translate(const Vector2D& vector);
  • posunie bod o daný vektor
int getX() const;
  • vráti hodnotu súradnice x
int getY() const;
  • vráti hodnotu súradnice y
void setX(int x);
  • nastaví súradnicu x
void setY(int y);
  • nastaví súradnicu y

Trieda Vector2D

Vector2D();
  • bezparametrický konštruktor, nastaví súradnice vektora na počiatok súradnicovej sústavy (0,0)
Vector2D(int x, int y);
  • nastaví vektor na dané súradnice
void add(const Vector2D& vector);
  • súčet vektorov
int getX() const;
  • vráti hodnotu súradnice x
int getY() const;
  • vráti hodnotu súradnice y
void setX(int x);
  • nastaví súradnicu x
void setY(int y);
  • nastaví súradnicu y

Trieda Color

Color();
  • bezparametrický konštruktor, nastaví sa čierna farba (nulové hodnoty RGB)
Color(unsigned int red, unsigned int green, unsigned int blue);
  • nastaví jednotlivé zložky na príslušné hodnoty
Color(std::string code);
  • nastaví jednotlivé zložky podľa zadaného hexadecimálneho kódu
  • formát kódu: RRGGBB (dve hexa číslice pre červenú, zelenú a modrú v tomto poradí)
  • kód bude vždy validný - musí mať práve 6 hexa znakov - toto nemusíte testovať
  • na riešenie môžte použiť aj nástroje z jazyka C - užitočný môže byť napríklad hlavičkový súbor <cstdlib>
std::string getCode() const;
  • vráti reťazec obsahujúci hexadecimálny kód farby
  • formát kódu: RRGGBB - vždy musí mať práve 6 znakov!
  • znaky a..f budú malými písmenami
  • na riešenie môžte použiť aj nástroje z jazyka C - môže byť užitočná napríklad funkcia sprintf(). V ďalších prednáškach sa budete učiť o prúdoch a ich manipulátoroch (C++ riešenie).
unsigned int getRed() const;
  • vráti červenú zložku farby
unsigned int getGreen() const;
  • vráti zelenú zložku farby
unsigned int getBlue() const;
  • vráti modrú zložku farby

Trieda Geometry2D

void setColor(const Color& color);
  • nastaví farbu objektu
void setPosition(const Point& position);
  • nastaví pozíciu objektu
Color getColor() const;
  • vráti farbu objektu
Point getPosition() const;
  • vráti pozíciu objektu
double getSum() const;
  • v triede Geometry2D abstraktná metóda, vráti obsah objektu
  • vzorce:
    • obsah kruhu: π·r²
    • obsah obdĺžnika: výška·šírka
    • obsah elipsy: π·a·b
  • hodnotu π použite z hlavičkového súboru cmath.
void printInfo() const;
  • v triede Geometry2D abstraktná metóda, vypíše informácie o objekte na štandarný výstup (std::cout)
  • formát: objekt at: (x,y), color: rrggbb
  • slovne: názov_objektu medzera „at“ dvojbodka medzera zátvorka súradnica_x čiarka súradnica_y zátvorka čiarka medzera „color“ dvojbodka medzera RGB_kód koniec_riadku
  • objekt - buď „circle“, „ellipse“ alebo „rectangle“
  • x, y - súradnice objektu
  • rrggbb - hexadecimálny kód farby objektu
  • všetko je malými písmenami
  • príklad: circle at: (14,15), color: a1b2c3
std::string getSVG() const;
  • abstraktná metóda, vráti reťazec obsahujúci SVG-tag prislúchajúci danému objektu - bude upresnené pre každú triedu zvlásť
  • podobne ako pri Color::getCode() môžete využiť napríklad sprintf()
Doplňte do triedy virtuálny deštruktor. Keďže sa riešenie úlohy predpokladá bez dynamickej alokácie, nebude mať extra význam, ale zabráni warningom pri preklade programu.

Trieda Circle

Trieda Circle dedí z triedy Geometry2D a implementuje jej abstraktné metódy. Ďalšie metódy:

Circle(unsigned int radius);
  • nastaví polomer na radius, pozíciu na bod (0,0) a farbu na čiernu RGB(0,0,0)
Circle(unsigned int radius, Color color);
  • nastaví polomer na radius, farbu na color a pozíciu na bod (0,0)
Circle(Point position, unsigned int radius);
  • nastaví polomer na radius, pozíciu na position a farbu na čiernu RGB(0,0,0)
Circle(Point position, unsigned int radius, Color color);
  • nastaví polomer na radius, farbu na color a pozíciu position
Circle(const Circle& circle);
  • kopírovací konštruktor
unsigned int getRadius() const;
  • vráti polomer kruhu
void setRadius(unsigned int radius);
  • nastaví polomer kruhu

Formát SVG značky pre Circle: <circle cx=„pos_x“ cy=„pos_y“ r=„polomer“ fill=„#rrggbb“/>

Slovne: zátvorka „circle“ medzera „cx=“ úvodzovka súradnica_x úvodzovka medzera „cy=“ úvodzovka súradnica_y úvodzovka medzera „r=“ úvodzovka polomer úvodzovka medzera „fill=“ úvodzovka krížik rgb_kód úvodzovka lomítko zátvorka

Príklad:

<circle cx="20" cy="20" r="10" fill="#12ab3f"/>

Za poslednú závorku nevkladajte znak nového riadku.

Trieda Rectangle

Trieda Rectangle dedí z triedy Geometry2D a implementuje jej abstraktné metódy. Ďalšie metódy:

Rectangle(unsigned int width, unsigned int height);
  • konštruktor, nastaví šírku na width, výšku na height, pozíciu na bod (0,0) a farbu na čiernu RGB(0,0,0)
Rectangle(unsigned int width, unsigned int height, Color color);
  • konštruktor, nastaví šírku na width, výšku na height, farbu na color a pozíciu na bod (0,0)
Rectangle(Point position, unsigned int width, unsigned int height);
  • konštruktor, nastaví šírku na width, výšku na height, pozíciu na position a farbu na čiernu RGB(0,0,0)
Rectangle(Point position, unsigned int width, unsigned int height, Color color);
  • konštruktor, nastaví šírku na width, výšku na height, pozíciu na position a farbu na color
Rectangle(const Rectangle& rectangle);
  • kopírovací konštruktor
unsigned int getWidth() const;
  • vráti šírku obĺžnika
unsigned int getHeight() const;
  • vráti výšku obĺžnika
void setWidth(unsigned int width);
  • zmení šírku obdĺžnika na width
void setHeight(unsigned int height);
  • zmení výšku obdĺžnika na height

Formát SVG značky pre Rectangle: <rect x=„pos_x“ y=„pos_y“ width=„šírka“ height=„výška“ fill=„#rrggbb“/>

Slovne: zátvorka „rect“ medzera „x=“ úvodzovka súradnica_x úvodzovka medzera „y=“ úvodzovka súradnica_y úvodzovka medzera „width=“ úvodzovka hodnota_šírky úvodzovka medzera „height=“ úvodzovka hodnota_výšky úvodzovka medzera „fill=“ úvodzovka krížik rgb_kód úvodzovka lomítko zátvorka

Príklad:

<rect x="0" y="0" width="50" height="50" fill="#0ab042"/>

Za poslednú závorku nevkladajte znak nového riadku.

Trieda Ellipse

Trieda Ellipse dedí z triedy Geometry2D a implementuje jej abstraktné metódy. Ďalšie metódy:

Ellipse(unsigned int a, unsigned int b);
  • konštruktor, nastaví dĺžku hlavnej polosi na a a vedľajšej polosi na b, pozíciu na bod (0,0) a farbu na čiernu RGB(0,0,0)
Ellipse(unsigned int a, unsigned int b, Color color);
  • konštruktor, nastaví dĺžku hlavnej polosi na a a vedľajšej polosi na b, farbu na color a pozíciu na bod (0,0)
Ellipse(Point position, unsigned int a, unsigned int b);
  • konštruktor, nastaví dĺžku hlavnej polosi na a a vedľajšej polosi na b, pozíciu na position a farbu na čiernu RGB(0,0,0)
Ellipse(Point position, unsigned int a, unsigned int b, Color color);
  • konštruktor, nastaví dĺžku hlavnej polosi na a a vedľajšej polosi na b, pozíciu na position a farbu na color
Ellipse(const Ellipse& ellipse);
  • kopírovací konštruktor
unsigned int getA() const;
  • vráti dĺžku hlavnej polosi
unsigned int getB() const;
  • vráti dĺžku vedľajšej polosi
void setA(unsigned int a);
  • nastaví dĺžku hlavnej polosi na a
void setB(unsigned int b);
  • nastaví dĺžku vedľajšej polosi na b

Formát SVG značky pre Ellipse: <ellipse cx=„pos_x“ cy=„pos_y“ rx=„hlavná_poloos“ ry=„vedľajšia_poloos“ fill=„#rrggbb“/>

Slovne: zátvorka „ellipse“ medzera „cx=“ úvodzovka súradnica_x úvodzovka medzera „cy=“ úvodzovka súradnica_y úvodzovka medzera „rx=“ úvodzovka dĺžka_a úvodzovka medzera „ry=“ úvodzovka dĺžka_b úvodzovka medzera „fill=“ úvodzovka krížik rgb_kód úvodzovka lomítko zátvorka

Príklad:

<ellipse cx="100" cy="50" rx="60" ry="12" fill="#0000ff"/>

Za poslednú závorku nevkladajte znak nového riadku.

SVG kreslítko

Tu si môžte stiahnuť: pictures.h, svgbuilder.h, main.cpp. súbory.

Program by s pomocou vami implementovaných tried mal dokázať nakresliť niečo takéto:

Samozrejme, fantázii sa medze nekladú a môžte si vytvoriť niečo vlastné.

Riešenie

Poznámky

Autor: Úlohu Mgr. Jana Juráňa upravil Ján Bella, v prípade nejasností kontaktujte na diskusnom fóre, prípadne na xbella1@fi.muni.cz.

QR Code
QR Code public:pb161_fall14_hw02 (generated for current page)