A10

package sk.upjs.paz1a.cvicenie10;

import java.awt.Color;

import sk.upjs.jpaz2.*;

public class Launcher {

        public static void main(String[] args) {
                WinPane sandbox = new WinPane();

                Tvar t;
                if (Math.random() < 0.5) {
                        t = new Kruh(130, 100, 40);
                } else {
                        t = new Obdlznik(200, 150, 40, 20);
                }

                t.vykresliSa(sandbox);
        }
}
package sk.upjs.paz1a.cvicenie10;

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, Color farba) {
                this.x = x;
                this.y = y;
                this.farba = farba;
        }

        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("Neviem sa vykreslit.");
        }

        public boolean jeVnutornyBod(double x, double y) {
                return false;
        }

}
package sk.upjs.paz1a.cvicenie10;

import java.awt.Color;

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

public class Kruh extends Tvar {

        private double polomer;

        public Kruh(double x, double y, double polomer) {
                super(x, y, Color.RED);
                setPolomer(polomer);
        }

        public double getPolomer() {
                return polomer;
        }

        public void setPolomer(double polomer) {
                this.polomer = polomer;
        }

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

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

}
package sk.upjs.paz1a.cvicenie10;

import java.awt.Color;

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, Color.BLUE);
                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;
        }

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

        @Override
        public boolean jeVnutornyBod(double x, double y) {
                double dx = this.getX() - x;
                double dy = this.getY() - y;
                return (Math.abs(dx) < sirka / 2) && (Math.abs(dy) < vyska / 2);
        }

}
package sk.upjs.paz1a.cvicenie10;

import java.util.Arrays;

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 = Arrays.copyOf(tvary, tvary.length + 1);
                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].setX(tvary[i].getX() + dx);
                        tvary[i].setY(tvary[i].getY() + dy);
                }
        }

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

                return null;
        }

        public void odstranTvar(Tvar t) {
                int index = -1;
                for (int i = 0; i < tvary.length; i++) {
                        if (tvary[i] == t) {
                                index = i;
                                break;
                        }
                }

                if (index < 0) {
                        return;
                }

                Tvar[] noveTvary = new Tvar[tvary.length - 1];
                System.arraycopy(tvary, 0, noveTvary, 0, index);
                System.arraycopy(tvary, index + 1, noveTvary, index, noveTvary.length - index);
                tvary = noveTvary;
        }
}
package sk.upjs.paz1a.cvicenie10;

import java.awt.Point;
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, 30, 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;
                }
        }

        public static void main(String[] args) {
                PlochaTvarov pt = new PlochaTvarov();
        }
}