P íklad t íd geometrických objekt a jejich vizualizace

Podobné dokumenty
Část I Třídy a objekty

Objektově orientované programování

Objektově orientované programování

Část I Objektově orientované programování - Dědičnost, kompozice a balíky

Úvod do programovacích jazyků (Java)

Java Enum Java, zimní semestr ,2017 1

Struktura třídy, operátory, jednoduché algoritmy, junit. Programování II 2. cvičení Alena Buchalcevová

Objektov orientované programování

Typický prvek kolekce pro české řazení

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Abstraktní datové typy: zásobník

typová konverze typová inference

Skalární sou in. Úvod. Denice skalárního sou inu

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Principy objektově orientovaného programování

KTE / ZPE Informační technologie

Algoritmizace a programování

Konceptuální modelování

1. Téma 12 - Textové soubory a výjimky

20. Projekt Domácí mediotéka

Seminář Java IV p.1/38

Objektově orientované programování v PHP 5. Martin Klíma

Generické programování

Část 1 Třídy a objekty. Objektově orientované programování. Část 2 Vztahy mezi objekty. Část 3 Objektově orientované programování (v Javě)

GUI v Jav a událostmi ízené programování

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Pravd podobnost a statistika - cvi ení. Simona Domesová místnost: RA310 (budova CPIT) web:

Teoretické minimum z PJV

e²ení systém lineárních rovnic pomocí s ítací, dosazovací a srovnávací metody

RMI Remote Method Invocation

Objektov orientované programování. C++ Akademie SH. 7. Objektov orientované programování. Michal Kvasni ka. Za áte níci C++ 2.

Objektově orientované programování

Obrázek. Základní popis, zadání úkolu. Struktura tříd,

Java a Caché IV: Manipulace s objekty

Čipové karty Lekařská informatika

Projekty pro výuku programování v jazyce Java

PŘETĚŽOVÁNÍ OPERÁTORŮ

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Java a XML. 10/26/09 1/7 Java a XML

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

Třída DrawingTool. Obrázek 1: Prázdné okno připravené pro kreslení

Vektor náhodných veli in - práce s více prom nnými

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

OOPR_05. Případové studie

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Jazyk C# (seminář 3)

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Java - výjimky. private void vstup() throws IOException {... }

Reflexe. Aplikační programování v Javě (BI-APJ) - 8 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Příklad aplikace Klient/Server s Boss/Worker modelem (informativní)

Datové struktury. alg12 1

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

public class Karel { private int position; public boolean issmiling; public int getposition() { return position;

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Integrování jako opak derivování

Programování v Javě I. Leden 2008

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Binární operace. Úvod. Pomocný text

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

PREPROCESOR POKRAČOVÁNÍ

Java Výjimky Java, zimní semestr

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

Java efektivně. Lukáš Zapletal liberix.cz. Pokročilejší techniky programování v Javě

3. Restrukturalizace nebo manipulace s údaji - práce s rastrovými daty

JAVA V Assertions Java, zimní semestr

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

BOZP - akcepta ní testy

Postřehová hra. Zadání projektu. 1 Moje cíle

Parametrizované třídy Generics generické třídy. JDK zavádí mimo jiné tzv. parametrizované třídy - generics

Seminá e. Ing. Michal Valenta PhD. Databázové systémy BI-DBS ZS 2010/11, sem. 1-13

Přehled probírané látky

Jazyk C# (seminář 6)

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Programování v Javě I. Únor 2009

11. Dědičnost. Dědičnost strana 103

7. Dynamické datové struktury

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

Orcad PCB Designer návrh plošných spojů část 2

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Java - řazení objektů

boolean hasnext() Object next() void remove() Kolekce

Abstraktní třída a rozhraní

Soubory. Katedra po íta. Ji í Vok ínek. P edná²ka 4 B6B36PJV Programování v JAVA. Fakulta elektrotechnická ƒeské vysoké u ení technické v Praze

Knihovna QT4 a moºnosti jejího vyuºití

P íklad 1 (Náhodná veli ina)

Úvod. Katedra po íta. Ji í Vok ínek. P edná²ka 1 B6B36PJV Programování v JAVA. Fakulta elektrotechnická ƒeské vysoké u ení technické v Praze

Soft Computing (SFC) 2014/2015 Demonstrace u ení sít RCE, Java aplikace

8. přednáška: Soubory a proudy

17. Projekt Trojúhelníky

George J. Klir. State University of New York (SUNY) Binghamton, New York 13902, USA

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Transkript:

P íklad t íd geometrických objekt a jejich vizualizace Ji í Vok ínek Katedra po íta Fakulta elektrotechnická ƒeské vysoké u ení technické v Praze P edná²ka 2 B6B36PJV Programování v JAVA Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 1 / 47

P íklad t íd geometrických objekt a jejich vizualizace Zadání Popis výchozích rozhraní a t íd Návrh e²ení Implementace P íklad pouºití Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 2 / 47

ƒást I P íklad geometrických objekt a jejich vizualizace Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 3 / 47

Zadání problému Cílem je vytvo it datovou reprezentaci základních geometrických objekt (bod, úse ka, kruºnice,... ) a rela ních operací nad t mito objekty, nap. zdali se n který objekt nachází uvnit jiného objektu Dále chceme objekty um t vizualizovat v rastrovém obrázku P íklad: zobrazení v²ech objekt uvnit kruºnice erven Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 4 / 47

Co je k dispozici Elementární rozhraní pro bod v rovin Coords Zobrazení: Rozhraní plátna (Canvas) a základní implementace realizována polem polí ( ArrayBackedCanvas) Základní rasteriza ní funkce pro vykreslení úse ky a kruºnice na m íºce (GridCanvasUtil) Rozhraní pro zobrazitelné objekty Printable Rozhraní pro uchování zobrazitelných objekt ObjectHolder a jeho základní implementace ObjectHolderImpl Elementární geometrické funkce pro testování, zdali jsou t i body kolineární a jestli bod leºí na úse ce (GeomUtil) Implementace je sou ástí knihovny gui.jar Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 5 / 47

Rozhraní Coords Bod v rovin je dán sou adnicemi x a y Rozhraní je dostate né obecné, abychom jej mohli pouºít jak pro geometrický bod, tak pro pozici v m íºce obrázku Pot ebujeme um t vytvo it bod a p e íst hodnoty x a y public interface Coords { public int getx(); public int gety(); public Coords createcoords(int x, int y); Pro jednoduchost uvaºujeme pouze celá ísla Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 6 / 47

Rozhraní Canvas Plátno (canvas) má své rozm ry, které pot ebujeme znát Nap íklad abychom nevykreslovali mimo rozsah rastrového obrázku! Kreslení do rastrového obrázku nám posta í pouze zm na barvy pixelu na p íslu²ném polí ku Pro barvu vyuºijeme t ídy Color z JDK import java.awt.color; public interface Canvas { public int getwidth(); public int getheight(); public void setcolorat(int x, int y, Color color); Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 7 / 47

Rozhraní Printable Od rozhraní Printable poºadujeme pouze jedinou vlastnost a to um t se vykreslit na plátno (Canvas) public interface Printable { public void printtocanvas(canvas canvas); Zp sob jakým se objekt vykreslí je závislý na konkrétním geometrickém objektu Zde ne e²íme a ani nem ºeme, protoºe nevíme jaké geometrické objekty budou denovány. Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 8 / 47

Rozhraní ObjectHolder Rozhraní ObjectHolder deklaruje metody pro p idání objektu a vykreslení v²ech uloºených objekt public interface ObjectHolder { public ObjectHolder add(printable object); public void printtocanvas(canvas canvas); Po adí vykreslení v rozhraní ne e²íme Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 9 / 47

Základní implementace ObjectHolderImpl Pro jednoduchou implementaci vysta íme s p ed alokovaným polem pro uloºení zobrazitelných objekt public class ObjectHolderImpl implements ObjectHolder { private final Printable[] objects; private int size; // the number of stored objects public ObjectHolderImpl(int max) { objects = new Printable[max]; size = 0; @Override public ObjectHolder add(printable object) { if (object!= null && size < objects.length) { objects[size++] = object; return this; @Override public void printtocanvas(canvas canvas) { for (int i = 0; i < size; ++i) { objects[i].printtocanvas(canvas); Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 10 / 47

Knihovna rasteriza ních funkcí GridCanvasUtil Vyuºijeme rozhraní Coords Metody p edstavují sadu utilit, proto volíme statické metody public class GridCanvasUtil { private GridCanvasUtil() { // library, no instance allowed /** * Bresenham's line algorithm to raster a straight-line segment into a grid * http://en.wikipedia.org/wiki/bresenham%27s_line_algorithm * * @param p0 * @param p1 * @return array of Coords representing rasterized segment from p0 to p1 */ public static Coords[] drawgridline(coords p0, Coords p1) {... public static Coords[] drawgridcircle(coords ct, int radius) {... Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 11 / 47

Knihovna geometrických funkcí GeomUtil Podobn pro geometrické funkce v rovin public class GeomUtil { private GeomUtil() { /** * Compute the winding number * * @param a point forming a line * @param b point forming a line * @param c testing point for the wind number * @return 0 if c is on the line a-b, <0 if c is on the left of the line * a-b, >0 if c is on the right of the line a-b */ public static int wind(coords a, Coords b, Coords c) {... /** * * @param a * @param b * @param c * @return true if point c is in between points a and b */ public static boolean inbetween(coords a, Coords b, Coords c) {... Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 12 / 47

Jednoduchá realizace plátna ArrayBackedCanvas Plátno je dvourozm rné pole barev public class ArrayBackedCanvas implements Canvas { private final int width, height; private final Color[][] canvas; public ArrayBackedCanvas(int width, int height) { this.width = width; this.height = height; canvas = new Color[width][height]; clearcanvas(color.white); public void clearcanvas(color color) {... @Override public void setcolorat(int x, int y, Color color) { canvas[x][y] = color; public void writetofile(string filename) throws IOException {... private BufferedImage generatebufferedimage() {... Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 13 / 47

Návrh e²ení e²ení zaloºíme na rozhraní z balíku gui.jar jehoº implementace nám zajistí, ºe bude moci pouºít plátno pro zobrazení geometrických objekt Zárove se pokusíme odd lit vizualizaci od vlastních geometrických operací, proto se nejd íve zam íme na geometrické objekty Geometrické objekty v²ak anotujeme barvou Tedy, kaºdý geometrický objekt má krom svého popisu také barvu Postup návrhu 1. Návrh hierarchie t íd geometrických objekt 2. Návrh testovací funkce pro ov ení funk nosti 3. Roz²í ení návrhu o vizualizaci Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 14 / 47

Návrh e²ení e²ení zaloºíme na rozhraní z balíku gui.jar jehoº implementace nám zajistí, ºe bude moci pouºít plátno pro zobrazení geometrických objekt Zárove se pokusíme odd lit vizualizaci od vlastních geometrických operací, proto se nejd íve zam íme na geometrické objekty Geometrické objekty v²ak anotujeme barvou Tedy, kaºdý geometrický objekt má krom svého popisu také barvu Postup návrhu 1. Návrh hierarchie t íd geometrických objekt 2. Návrh testovací funkce pro ov ení funk nosti 3. Roz²í ení návrhu o vizualizaci Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 14 / 47

Hierarchie t íd geometrických objekt Geom Point Segment Circle Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 15 / 47

Abstraktní t ída Geom 1/2 Základní geometrický objekt p edstavuje spole nou abstraktní t ídu Deklarujeme dv základní geometrické operace isequal a isinside public abstract class Geom { protected Color color; public Geom(Color color) { this.color = color; isequal pouºijeme pro p edenování metody equals public abstract boolean isequal(geom geom); public abstract boolean isinside(geom geom); public Color getcolor() { return color; public void setcolor(color color) { this.color = color; Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 16 / 47

Abstraktní t ída Geom 2/2 Dále p edenuje metody t ídy Object import java.util.objects; public abstract class Geom { @Override public String tostring() { return "Geom{shape="+ getshapename() + ",color=" + color + ''; // @return string representation of the shape name public abstract String getshapename(); @Override public int hashcode() {... @Override public boolean equals(object obj) { if (obj == null) { return false; if (getclass()!= obj.getclass()) { return false; final Geom other = (Geom) obj; if (!Objects.equals(this.color, other.color)) { return false; return isequals(other); // isequals is defined in derived class Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 17 / 47

T ída Point 1/3 Pro t ídu Point p ipravíme n kolik konstruktor Point také pouºijeme pro implementaci rozhraní Coords pouºívané v metodách knihovny GeomUtil public class Point extends Geom implements Coords { private final int x; // for simplicity we use int private final int y; // as coords in plane public Point(int x, int y) { this(x, y, Color.BLUE); public Point(int x, int y, Color color) { this(x, y, color); public Point(int x, int y, Color color) { super(color); this.x = x; this.y = y; @Override public String getshapename() { return "Point"; Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 18 / 47

T ída Point 2/3 Rozhraní Coords p edepisuje metody getx(), gety() a createcoords() public class Point extends Geom implements Coords {... @Override public int getx() { return x; @Override public int gety() { return y; @Override public Coords createcoords(int x, int y) { return new Point(x, y);... Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 19 / 47

T ída Point 3/3 Implementace geometrických operací je omezena pouze na relace s jiným bodem public class Point extends Geom implements Coords { @Override public boolean isequals(geom geom) { boolean ret = geom == this; if (!ret && geom instanceof Point) { Point pt = (Point) geom; ret = x == pt.x && y == pt.y; return ret; @Override public boolean isinside(geom geom) { boolean ret = false; // A geom object cannot be inside a point return ret; Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 20 / 47

T ída Segment 1/3 Úse ka je denována dv ma body public class Segment extends Geom { private final Point p0; private final Point p1; public Segment(Point pt1, Point pt2) { this(pt1, pt2, Color.GREEN); public Segment(Point pt1, Point pt2, Color color) { super(color); if (pt1 == null pt2 == null pt1.equals(pt2)) { throw new IllegalArgumentException(); p0 = pt1; p1 = pt2; @Override public String getshapename() { return "Segment"; Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 21 / 47

T ída Segment 2/3 Implementace geometrických operací je vztaºena na Point i Segment public class Segment extends Geom {... @Override public boolean isinside(geom geom) { if (geom == null) { return false; boolean ret = this == geom; if (!ret && geom instanceof Point) { ret = isinside((point) geom); else if (!ret && geom instanceof Segment) { ret = isinside((segment) geom); return ret;... Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 22 / 47

T ída Segment 3/3 Pro testování, zdali bod leºí na úse ce, vyuºijeme funkce z GeomUtil public class Segment extends Geom {... public boolean isinside(point pt) { if (pt == null) { return false; boolean collinear = GeomUtil.wind(p0, p1, pt) == 0; return collinear && GeomUtil.inBetween(p0, p1, pt); public boolean isinside(segment s) { if (s == null) { return false; return isinside(s.p0) && isinside(s.p1);... Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 23 / 47

T ída Circle 1/3 Pro kruºnice volíme základní barvu ervenou public class Circle extends Geom { private final Point center; private final int radius; public Circle(Point center, int radius) { this(center, radius, Color.RED); public Circle(Point center, int radius, Color color) { super(color); if (center == null radius <= 0) { throw new IllegalArgumentException(); this.center = center; this.radius = radius; @Override public String getshapename() { return "Circle"; Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 24 / 47

T ída Circle 2/3 Pro test isinside rozli²ujeme uº t i objekty public class Circle extends Geom {... @Override public boolean isinside(geom geom) { if (geom == null) { return false; boolean ret = this == geom; if (ret) { return ret; if (geom instanceof Point) { ret = isinside((point) geom); else if (geom instanceof Segment) { ret = isinside((segment) geom); else if (geom instanceof Circle) { ret = isinside((circle) geom); return ret;... Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 25 / 47

T ída Circle 3/3 Testujeme bod, úse ku a také jinou kruºnici public class Circle extends Geom {... public boolean isinside(point pt) { if (pt == null) { return false; int dx = pt.getx() - center.getx(); int dy = pt.gety() - center.gety(); return ((dx * dx + dy * dy) <= radius * radius); public boolean isinside(segment sg) { if (sg == null) { return false; return isinside(sg.getp0()) && isinside(sg.getp1()); public boolean isinside(circle c) { if (c == null) { return false; int rd = radius - c.radius; if (rd > 0) { return new Circle(center, rd).isinside(c.center); return false; Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 26 / 47

P íklad pouºití Zji²t ní, zdali testovací body leºí uvnit kruºnice Point pt1 = new Point(320, 240); Circle c1 = new Circle(new Point(100, 100), 50); Point pt2 = new Point(75, 75); Point pt3 = new Point(125, 125); Segment s1 = new Segment(pt1, pt2); Segment s2 = new Segment(pt2, pt3); System.out.println("pt1: " + pt1); System.out.println("pt1 is inside circle: " + c1.isinside(pt1)); System.out.println("pt2 is inside circle: " + c1.isinside(pt2)); System.out.println("s1 is inside circle: " + c1.isinside(s1)); System.out.println("s2 is inside circle: " + c1.isinside(s2)); P íklad výstupu pt1: Geom{shape=Point,color=java.awt.Color[r=0,g=0,b=255] pt1 is inside circle: false pt2 is inside circle: true s1 is inside circle: false s2 is inside circle: true Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 27 / 47

Ov ení funk nosti knihovny Pe liv navrhneme kongurace, pro které ov íme, ºe implementované e²ení dává správný výsledek Hodnoty m ºeme vypsat na standardní výstup nebo program krokovat Oba zp soby jsou sice funk ní, ale p ehledn j²í bude zobrazit výstup gracky Jednotlivým geometrickým objekt m proto implementujeme rozhraní Printable, tj. roz²í íme je o metodu printtocanvas Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 28 / 47

Ov ení funk nosti knihovny Pe liv navrhneme kongurace, pro které ov íme, ºe implementované e²ení dává správný výsledek Hodnoty m ºeme vypsat na standardní výstup nebo program krokovat Oba zp soby jsou sice funk ní, ale p ehledn j²í bude zobrazit výstup gracky Jednotlivým geometrickým objekt m proto implementujeme rozhraní Printable, tj. roz²í íme je o metodu printtocanvas Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 28 / 47

T ída Point jako Printable 1/2 Bod budeme vykreslovat nikoliv jako jeden pixel, ale jako malý disk o polom ru radius Doplníme poloºku a roz²í íme konstruktor public class Point extends Geom implements Coords, Printable {... private int radius; public Point(int x, int y, Color color, int radius) { super(color); this.x = x; this.y = y; this.radius = radius;... Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 29 / 47

T ída Point jako Printable 2/2 Implementujeme vykreslení disku o polom ru radius public void printtocanvas(canvas canvas) { if (canvas == null) { return; final int w = canvas.getwidth(); final int h = canvas.getheight(); final int r2 = radius * radius; for (int i = x - radius; i <= x + radius; ++i) { for (int j = y - radius; j <= y + radius; ++j) { if (i >= 0 && i < w && j >= 0 && j < h) { final int dx = (x - i); final int dy = (y - j); final int r = dx * dx + dy * dy; if (r < r2) { canvas.setcolorat(i, j, color); Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 30 / 47

T ída Segment jako Printable Implementujeme vykreslení s vyuºitím rasteriza ní funkce drawgridline z GridCanvasUtil public class Segment extends Geom implements Printable { @Override public void printtocanvas(canvas canvas) { if (canvas == null) { return; Coords[] line = GridCanvasUtil.drawGridLine(p0, p1); if (line == null) { return; final int w = canvas.getwidth(); final int h = canvas.getheight(); for (int i = 0; i < line.length; ++i) { Coords pt = line[i]; if ( pt.getx() >= 0 && pt.getx() < w && pt.gety() >= 0 && pt.gety() < h ) { canvas.setcolorat(pt.getx(), pt.gety(), color); Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 31 / 47

T ída Circle jako Printable Implementujeme vykreslení s vyuºitím rasteriza ní funkce drawgridline z GridCanvasUtil public class Circle extends Geom implements Printable { @Override public void printtocanvas(canvas canvas) { if (canvas == null) { return; Coords[] pts = GridCanvasUtil.drawGridCircle(center, radius); if (pts == null) { return; final int w = canvas.getwidth(); final int h = canvas.getheight(); for (int i = 0; i < pts.length; ++i) { Coords pt = pts[i]; if ( pt.getx() >= 0 && pt.getx() < w && pt.gety() >= 0 && pt.gety() < h ) { canvas.setcolorat(pt.getx(), pt.gety(), color); Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 32 / 47

P íklad vykreslení objekt Geometrické objekty se uº umí vykreslit na plátno (canvas) Vytvo íme instanci ArrayBackedCanvas Za²leme zprávu p íslu²nému objektu, aby se vykreslil Obsah plátna následn uloºíme do souboru Circle c1 = new Circle(new Point(100, 100), 50); ArrayBackedCanvas canvas = new ArrayBackedCanvas(640, 480); c1.printtocanvas(canvas); canvas.writetofile("circle.png"); Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 33 / 47

Vykreslená kruºnice v souboru circle.png Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 34 / 47

Dal²í úkoly Máme implementovány základní funk nosti pro zobrazení Vykreslení objekt v²ak není p íli² pohodlné Vytvo íme proto kontejner pro reprezentaci scény a hromadn j²í dotazy, zdali jsou objekty scény uvnit zvoleného geometrického objektu Scénu realizujeme jako t ídu GeomObjectArray, která bude poskytovat pole aktuálních objekt public class GeomObjectArray {... public Geom[] getarray() {...... Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 35 / 47

Dal²í úkoly Máme implementovány základní funk nosti pro zobrazení Vykreslení objekt v²ak není p íli² pohodlné Vytvo íme proto kontejner pro reprezentaci scény a hromadn j²í dotazy, zdali jsou objekty scény uvnit zvoleného geometrického objektu Scénu realizujeme jako t ídu GeomObjectArray, která bude poskytovat pole aktuálních objekt public class GeomObjectArray {... public Geom[] getarray() {...... Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 35 / 47

GeomObjectArray Kontejner realizujeme jako p ed-alokované pole dostate né velikosti Implementujeme metodu add, která p idá objekt do pole V p ípad napln ní kapacity alokujeme pole v t²í, kterým nahradíme pole p vodní P ístup k poli zapouzd íme metodami add a getarray public class GeomObjectArray { private Geom[] objects; private int size; private final int DEFAULT_SIZE_RESERVE = 100; public GeomObjectArray() { objects = new Geom[DEFAULT_SIZE_RESERVE]; public GeomObjectArray add(geom obj) {... public Geom[] getarray() {... Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 36 / 47

GeomObjectArray add public class GeomObjectArray {... public GeomObjectArray add(geom obj) { if (size == objects.length) { Geom[] objectsnew = new Geom[objects.length + DEFAULT_SIZE_RESERVE]; for (int i = 0; i < objects.length; ++i) { objectsnew[i] = objects[i]; objects = objectsnew; //replace the array objects[size++] = obj; return this; //return this to string the add call... Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 37 / 47

GeomObjectArray getarray public class GeomObjectArray {... public Geom[] getarray() { Geom[] ret = new Geom[size]; for (int i = 0; i < size; ++i) { ret[i] = objects[i]; return ret; Na první pohled neefektivní, ale metoda nám zaji² uje, ºe je scéna reprezentována polem o velikost odpovídající objekt m ve scén. Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 38 / 47

Obarvení objekt uvnit jiného objektu Vytvo íme metodu, která nastaví barvu v²ech objekt uvnit jiného objektu public void markcolorinside(geom[] objects, Geom largeobject, Color color) { if (objects == null largeobject == null color == null) { return; for (int i = 0; i < objects.length; ++i) { Geom obj = objects[i]; if (obj!= null && largeobject.isinside(obj)) { obj.setcolor(color); Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 39 / 47

P íklad pouºití public void start(string[] args) { Point pt1 = new Point(320, 240); Point pt2 = new Point(75, 75); Point pt3 = new Point(125, 125); Segment s1 = new Segment(pt1, pt2); Segment s2 = new Segment(pt2, pt3); Circle c1 = new Circle(new Point(100, 100), 50); Circle c2 = new Circle(new Point(400, 400), 400); c2.setcolor(new Color(255, 130, 71)); //RoyalBlue GeomObjectArray geomobjects = new GeomObjectArray(); geomobjects.add(pt1).add(pt2).add(pt3).add(s1).add(s2); geomobjects.add(c1).add(c2); markcolorinside(geomobjects.getarray(), c1, Color.RED); gui Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 40 / 47

P íklad pouºití vykreslení Pro vykreslení m ºeme pouºít objekt, který má rozhraní ObjectHolder Bu m ºeme pouºít implementaci ObjectHolderImpl Nap. kompozicí Nebo vyuºijeme znalosti, ºe n které podt ídy Geom implementují rozhraní Printable a implementujeme metodu printtocanvas public void printtocanvas(geom[] objects, Canvas canvas) { for (int i = 0; i < objects.length; ++i) { Geom obj = objects[i]; if (obj instanceof Printable) { ((Printable) obj).printtocanvas(canvas); Zkuste roz²í it t ídu GeomObjectArray o rozhraní Printable a vysv tlete úskalí implementace dvou metod add. Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 41 / 47

Uloºení obrázku Uloºení plátna m ºeme spojit s p ekreslením aktuální scény v metod savecanvas public void savecanvas(geomobjectarray geomobjects, ArrayBackedCanvas canvas, String out) { try { canvas.clearcanvas(color.white); printtocanvas(geomobjects.getarray(), canvas); canvas.writetofile(out); catch (IOException e) { System.err.println("Error: writing canvas to the file '" + out + "'"); Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 42 / 47

Pouºití metody markcolorinside... GeomObjectArray geomobjects = new GeomObjectArray(); geomobjects.add(pt1).add(pt2).add(pt3).add(s1).add(s2); geomobjects.add(c1).add(c2); ArrayBackedCanvas canvas = new ArrayBackedCanvas(640, 480); savecanvas(geomobjects, canvas, "objects.png"); markcolorinside(geomobjects.getarray(), c1, Color.RED); savecanvas(geomobjects, canvas, "objects-inside_circle-c1.png"); setcolor(geomobjects.getarray(), Color.BLUE); markcolorinside(geomobjects.getarray(), c2, Color.ORANGE); savecanvas(geomobjects, canvas, "objects-inside_circle-c2.png"); Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 43 / 47

P íklad výstupu objects.png Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 44 / 47

P íklad výstupu objects-inside_circle-c1.png Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 45 / 47

P íklad výstupu objects-inside_circle-c2.png Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 46 / 47

P íklad geometrický objekt Navrhli jsme hierarchii geometrický objekt Implementovali jsme operaci testování, zdali objekt leºí uvnit jiného objektu isinside Vizualizaci jsem realizovali s vyuºitím rozhraní a implementací z balíku t ídy gui.jar Pouºití jednotlivých objekt je moºné, ale reprezentace scény není pohodlná Pro práci s mnoºinou objekt pot ebujeme vhodný kontejner Zatím známe pouze datový typ pole statické délky Pro efektivní práci s více prom nnými (t eba i jiného typu) pot ebujeme sloºit j²í datové struktury Spojové seznamy, fronty, zásobníky, pole dynamické délky, atd. Jan Faigl, Ji í Vok ínek, 2015 B6B36PJV P edná²ka 2: Geom 47 / 47