A9

import java.awt.Color;

import sk.upjs.jpaz2.Pane;


public class Tvar {

        private double x;
        private double y;
        private Color farba;

        public Tvar(double x, double y) {
                this.x = x;
                this.y = y;
                farba = Color.red;
        }

        public double getX() {
                return x;
        }

        public void setX(double x) {
                this.x = x;
        }

        public double getY() {
                return y;
        }

        public void setY(double y) {
                this.y = y;
        }

        public Color getFarba() {
                return farba;
        }

        public void setFarba(Color farba) {
                this.farba = farba;
        }

        public void vykresliSa(Pane plocha) {
                System.err.println("Ja sa neviem kreslit.");
        }
}
import sk.upjs.jpaz2.Pane;
import sk.upjs.jpaz2.Turtle;


public class Kruh extends Tvar {

        private double r;

        public Kruh(double x, double y, double r) {
                super(x, y);
                setR(r);
        }

        public double getR() {
                return r;
        }

        public void setR(double r) {
                this.r = Math.abs(r);
        }

        public void vykresliSa(Pane plocha) {
                Turtle kreslic = new Turtle();
                plocha.add(kreslic);
                kreslic.setPosition(getX(), getY());
                kreslic.setFillColor(getFarba());
                kreslic.dot(r);
                plocha.remove(kreslic);
        }
}
import sk.upjs.jpaz2.Pane;
import sk.upjs.jpaz2.Turtle;

public class Obdlznik extends Tvar {

        private double sirka;
        private double vyska;

        public Obdlznik(double x, double y, double sirka, double vyska) {
                super(x, y);
                setSirka(sirka);
                setVyska(vyska);
        }

        public double getSirka() {
                return sirka;
        }

        public void setSirka(double sirka) {
                this.sirka = sirka;
        }

        public double getVyska() {
                return vyska;
        }

        public void setVyska(double vyska) {
                this.vyska = vyska;
        }

        public void vykresliSa(Pane plocha) {
                Turtle kreslic = new Turtle();
                plocha.add(kreslic);
                kreslic.setPosition(getX() - sirka/2, getY()-vyska/2);
                kreslic.setFillColor(getFarba());
                kreslic.penUp();
                kreslic.openPolygon();
                kreslic.setDirection(90);
                for (int i=0; i<2; i++) {
                        kreslic.step(sirka);
                        kreslic.turn(90);
                        kreslic.step(vyska);
                        kreslic.turn(90);
                }
                kreslic.closePolygon();
                plocha.remove(kreslic);
        }
}
import java.awt.Color;

import sk.upjs.jpaz2.JPAZUtilities;
import sk.upjs.jpaz2.WinPane;


public class Spustac {

        /**
         * @param args
         */

        public static void main(String[] args) {
                Tvar t = null;
                if (Math.random() < 0.5) {
                        t = new Kruh(100, 150, 40);
                        t.setFarba(Color.blue);
                } else {
                        t = new Obdlznik(100, 150, 40, 20);
                        t.setFarba(Color.orange);
                }

                if (t instanceof Kruh) {
                        System.out.println("Nahodne sa vytvoril kruh.");
                }

                WinPane papier = new WinPane();
                //JPAZUtilities.delay(2000);
                t.vykresliSa(papier);
        }

}

import java.awt.Color;

import sk.upjs.jpaz2.Pane;


public class Tvar {

        private double x;
        private double y;
        private Color farba;

        public Tvar(double x, double y) {
                this.x = x;
                this.y = y;
                farba = Color.red;
        }

        public double getX() {
                return x;
        }

        public void setX(double x) {
                this.x = x;
        }

        public double getY() {
                return y;
        }

        public void setY(double y) {
                this.y = y;
        }

        public Color getFarba() {
                return farba;
        }

        public void setFarba(Color farba) {
                this.farba = farba;
        }

        public void posun(double dx, double dy) {
                setX(getX() + dx);
                setY(getY() + dy);
        }

        public void vykresliSa(Pane plocha) {
                System.err.println("Ja sa neviem kreslit.");
        }

        public boolean jeVnutornyBod(double x, double y) {
                System.err.println("???");
                return false;
        }
}
import sk.upjs.jpaz2.Pane;
import sk.upjs.jpaz2.Turtle;

public class Kruh extends Tvar {

        private double r;

        public Kruh(double x, double y, double r) {
                super(x, y);
                setR(r);
        }

        public double getR() {
                return r;
        }

        public void setR(double r) {
                this.r = Math.abs(r);
        }

        public void vykresliSa(Pane plocha) {
                Turtle kreslic = new Turtle();
                plocha.add(kreslic);
                kreslic.setPosition(getX(), getY());
                kreslic.setFillColor(getFarba());
                kreslic.dot(r);
                plocha.remove(kreslic);
        }

        public boolean jeVnutornyBod(double x, double y) {
                double dx = this.getX() - x;
                double dy = this.getY() - y;
                return Math.sqrt(dx * dx + dy * dy) < r;
        }

}
import sk.upjs.jpaz2.Pane;
import sk.upjs.jpaz2.Turtle;

public class Obdlznik extends Tvar {

        private double sirka;
        private double vyska;

        public Obdlznik(double x, double y, double sirka, double vyska) {
                super(x, y);
                setSirka(sirka);
                setVyska(vyska);
        }

        public double getSirka() {
                return sirka;
        }

        public void setSirka(double sirka) {
                this.sirka = sirka;
        }

        public double getVyska() {
                return vyska;
        }

        public void setVyska(double vyska) {
                this.vyska = vyska;
        }

        public void vykresliSa(Pane plocha) {
                Turtle kreslic = new Turtle();
                plocha.add(kreslic);
                kreslic.setPosition(getX() - sirka / 2, getY() - vyska / 2);
                kreslic.setFillColor(getFarba());
                kreslic.penUp();
                kreslic.openPolygon();
                kreslic.setDirection(90);
                for (int i = 0; i < 2; i++) {
                        kreslic.step(sirka);
                        kreslic.turn(90);
                        kreslic.step(vyska);
                        kreslic.turn(90);
                }
                kreslic.closePolygon();
                plocha.remove(kreslic);
        }

        public boolean jeVnutornyBod(double x, double y) {
                return (Math.abs(x - this.getX()) < sirka / 2)
                                && (Math.abs(y - this.getY()) < vyska / 2);
        }
}
import sk.upjs.jpaz2.Pane;

public class ZoznamTvarov {
        private Tvar[] tvary = new Tvar[0];

        public void pridajTvar(Tvar t) {
                if (t == null) {
                        return;
                }

                Tvar[] noveTvary = new Tvar[tvary.length + 1];
                System.arraycopy(tvary, 0, noveTvary, 0, tvary.length);
                noveTvary[noveTvary.length - 1] = t;
                tvary = noveTvary;
        }

        public void nakresliVsetky(Pane plocha) {
                for (int i = 0; i < tvary.length; i++) {
                        tvary[i].vykresliSa(plocha);
                }
        }

        public void posun(double dx, double dy) {
                for (int i = 0; i < tvary.length; i++) {
                        tvary[i].posun(dx, dy);
                }
        }

        public Tvar bodTvaru(double x, double y) {
                for (int i = 0; i < tvary.length; i++) {
                        if (tvary[i].jeVnutornyBod(x, y)) {
                                return tvary[i];
                        }
                }

                return null;
        }

        public void odstranTvar(Tvar t) {
                int pocetOstavajucich = 0;
                for (int i = 0; i < tvary.length; i++) {
                        if (tvary[i] != t) {
                                pocetOstavajucich++;
                        }
                }

                Tvar[] nTvary = new Tvar[pocetOstavajucich];
                int zapisovaciIdx = 0;
                for (int i = 0; i < tvary.length; i++) {
                        if (tvary[i] != t) {
                                nTvary[zapisovaciIdx] = tvary[i];
                                zapisovaciIdx++;
                        }
                }

                tvary = nTvary;
        }
}
import java.awt.event.MouseEvent;

import sk.upjs.jpaz2.WinPane;

public class PlochaTvarov extends WinPane {

        private ZoznamTvarov tvary;

        private double dragX;
        private double dragY;
        private boolean tahanie = false;

        public PlochaTvarov() {
                this.tvary = new ZoznamTvarov();
        }

        @Override
        protected void onMouseClicked(int x, int y, MouseEvent detail) {
                if (detail.getButton() == MouseEvent.BUTTON1) {
                        if (detail.isAltDown()) {
                                this.tvary.pridajTvar(new Kruh(x, y, 30));
                        } else {
                                this.tvary.pridajTvar(new Obdlznik(x, y,
                                                20 + Math.random() * 20, 20 + Math.random() * 20));
                        }
                }

                if (detail.getButton() == MouseEvent.BUTTON3) {
                        Tvar naOdstranenie = this.tvary.bodTvaru(x, y);
                        if (naOdstranenie != null) {
                                this.tvary.odstranTvar(naOdstranenie);
                        }
                }

                this.clear();
                this.tvary.nakresliVsetky(this);
        }

        @Override
        protected void onMousePressed(int x, int y, MouseEvent detail) {
                if (detail.getButton() == MouseEvent.BUTTON1) {
                        this.tahanie = true;
                        this.dragX = x;
                        this.dragY = y;
                }
        }

        @Override
        protected void onMouseDragged(int x, int y, MouseEvent detail) {
                if (this.tahanie) {
                        tvary.posun(x - this.dragX, y - this.dragY);
                        this.dragX = x;
                        this.dragY = y;
                        this.clear();
                        this.tvary.nakresliVsetky(this);
                }
        }

        @Override
        protected void onMouseReleased(int x, int y, MouseEvent detail) {
                if (detail.getButton() == MouseEvent.BUTTON1) {
                        this.tahanie = false;
                }
        }
}
import java.awt.Color;

import sk.upjs.jpaz2.JPAZUtilities;
import sk.upjs.jpaz2.WinPane;

public class Spustac {

        /**
         * @param args
         */

        public static void main(String[] args) {
                Tvar t = null;
                if (Math.random() < 0.5) {
                        t = new Kruh(100, 150, 40);
                        t.setFarba(Color.blue);
                } else {
                        t = new Obdlznik(100, 150, 40, 20);
                        t.setFarba(Color.orange);
                }

                if (t instanceof Kruh) {
                        System.out.println("Nahodne sa vytvoril kruh.");
                }

                //WinPane papier = new WinPane();
                // JPAZUtilities.delay(2000);
                //t.vykresliSa(papier);
                //System.out.println(t.jeVnutornyBod(200, 200));
                PlochaTvarov pt = new PlochaTvarov();
        }

}