====== Úloha k procvičení 2 - Jednoduchá 2D Grafika ====== Tato úloha je domací úkol z letního semestru 2013. Od té doby nebyla revidována ani nebyly opraveny potenciální nedostatky v zadání. V rámci domácího úkolu naprogramujte implementaci tříd pro reprezentaci grafických primitiv a podporu tisku v režimu CMYK. Začněte tím, že si stáhnete a nahrajete do projektu zdrojové kódy {{:courses:a0b36pr2:opt:opt02.zip|}}. Vaše vypracované třídy dejte do balíčku ''cz.cvut.k36.pr2.hw.hw02.impl''. Úkoly: - Nastudujte si jak je strukturovaný ''enum RGB''. - Obdobně implemntujte ''enum CMYK'', který bude mít položky ''CYAN, MAGENTA, YELLOW, KEY''. Co mají které metody dělat najdete v javadocu k interface ''Ink''. Vzorečky na převody najdete na Internetu, například [[http://www.rapidtables.com/convert/color/rgb-to-cmyk.htm|RGB -> CMYK]] a [[http://www.rapidtables.com/convert/color/cmyk-to-rgb.htm|CMYK -> RGB,]] - Implementujte ''Shape'' do 2D primitiv ''Rectangle, Circle'' a ''Line''. Přesný tvar konstruktorů a detaily viz níže. - Vyzkoušejte váš kód pomocí ''main'' metod ve třídách ''Test'' a ''CMYKTest''. Pokud budete mít vše správně, vygenerují se vám k projektu zajímavé obrázky. ;-) - Odevzdejte vytvořené třídy. Můžete si vytvořit libovolné množství pomocných třídy, pokud to uznáte za vhodné. V tom případě je odevzdávejte také. ===== Implementace grafických primitiv ===== Pixely jsou reprezentovány pomocí celočíselných souřadnic ''x, y''. Tyto souřadnice udávají pozici **středu** pixelu. Z toho vyplývá, že pixel má rozměry 1x1. Pro operace s grafickými primitivy můžete aplikovat vaše znalosti z analytické geometrie. Anebo si můžete nastudovat dokumentaci k různým Java AWT knihovnám, například [[http://docs.oracle.com/javase/7/docs/api/java/awt/Shape.html|Shape]], [[http://docs.oracle.com/javase/7/docs/api/java/awt/geom/Ellipse2D.Double.html|Ellipse2D.Double]], [[http://docs.oracle.com/javase/7/docs/api/java/awt/geom/Rectangle2D.Double.html|Rectangle2D.Double]] a [[http://docs.oracle.com/javase/7/docs/api/java/awt/geom/Line2D.Double.html|Line2D.Double]]. Implementace řešení je čistě na vás, přesnost výpočtu provádějte pomocí ''double'', nikoliv ''float''. Pro třídy ''Rectangle'' a ''Circle'' platí, že se do pixelu na souřadnicích ''x, y'' zakreslí pokud bude střed pixelu ležet v oblasti pokryté daným primitivem. Úsečka se do pixelu na souřadnicích ''x, y'' vkreslí, pokud je střed pixelu úsečce blíže, než je vzdálenost rohu pixelu od jeho středu. Konstruktory pro primitiva jsou následující: public Rectangle(Color color, double bottomLeftX, double bottomLeftY, double topRightX, double topRightY) public Line(Color color, double startX, double startY, double endX, double endY) public Circle(Color color, double centerX, double centerY, double radius) Nakonec implementujte interface ''ShapeHolder'' do třídy ''ShapeHolderImpl''. Třída bude mít bezparametrický konstruktor. Funkci metod najdete v javadocu interface ''ShapeHolder''.