D10

Praktické cvičenie 04.12.2012

import java.util.Comparator;

public class RetazcovyPorovnavac implements Comparator<String> {

        private int pocetPorovnani = 0;

        @Override
        public int compare(String r1, String r2) {
                System.out.println(r1 + " <--> " + r2);
                pocetPorovnani++;

                if (r1.length() == r2.length()) {
                        return r1.compareTo(r2);
                } else {
                        return r1.length() - r2.length();
                }
        }

        public void vynulujPocitadlo() {
                pocetPorovnani = 0;
        }

        public int getPocetPorovnani() {
                return pocetPorovnani;
        }
}
package sk.upjs;

import java.awt.Color;

public class Bod {

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

        public Bod(double x, double y) {
                this.x = x;
                this.y = y;
        }

        public Bod(double x, double y, Color c) {
                this.x = x;
                this.y = y;
                this.farba = c;
        }

        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 String toString() {
                String s = "";
                s = s + "x: " + x + ",";
                s = s + "y: " + y + ",";
                if (farba != null)
                        s = s + "farba: " + "(" + farba.getRed() + "," + farba.getBlue()
                                        + "," + farba.getGreen() + ")";

                return s;
        }

        void nastav(double x, double y) {
                this.x = x;
                this.y = y;

        }

        void nastav(Bod bod) {
                // this.x = bod.getX();
                // this.y = bod.getY();
                this.nastav(x, y);

        }

        boolean rovnakeSuradnice(Bod bod) {
                if ((this.x == bod.getX()) && (this.y == bod.getY()))
                        return true;

                return false;
        }

        double vzdialenostK(double x, double y) {
                double vzdialenost = Math.pow(Math.abs(this.getX() - x), 2)
                                + Math.pow(Math.abs(this.getY() - y), 2);
                vzdialenost = Math.sqrt(vzdialenost);
                return vzdialenost;
        }

        double vzdialenostK(Bod bod) {
                return this.vzdialenostK(bod.x, bod.y);
        }

        void posunO(double dx, double dy) {
                this.x = x + dx;
                this.y = y + dy;
        }

        Bod posunutyBod(double dx, double dy) {
                return new Bod(x + dx, y + dy);
        }
}
package sk.upjs;

import java.util.Comparator;

public class BodovyPorovnavac implements Comparator<Bod> {

        private Bod bod;

        public BodovyPorovnavac(Bod bod) {
                this.bod = bod;
        }

        @Override
        public int compare(Bod b1, Bod b2) {
                return Double.compare(b1.vzdialenostK(bod), b2.vzdialenostK(bod));
        }
}
package sk.upjs.test;

import java.awt.Color;
import java.awt.geom.Point2D;

public class FarebnyBod extends Point2D implements Comparable<FarebnyBod> {

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

        public FarebnyBod(double x, double y, Color farba) {
                super();
                this.x = x;
                this.y = y;
                this.farba = farba;
        }

        public FarebnyBod(double x, double y) {
                super();
                this.x = x;
                this.y = y;
                this.farba = vyberFarbu(Color.blue, Color.red, Color.green);
        }

        private Color vyberFarbu(Color... farby) {
                return farby[(int) (Math.random() * farby.length)];
        }

        public double vzdialenostK(Point2D bod) {
                return vzdialenostK(bod.getX(), bod.getY());
        }

        public double vzdialenostK(double bx, double by) {
                double x2 = (x - bx) * (x - bx);
                double y2 = (y - by) * (y - by);

                return Math.sqrt(x2 + y2);
        }

        @Override
        public String toString() {
                return x + " " + y + " " + farba.getRGB();
        }

        @Override
        public int hashCode() {
                final int prime = 31;
                int result = super.hashCode();
                result = prime * result + ((farba == null) ? 0 : farba.hashCode());
                long temp;
                temp = java.lang.Double.doubleToLongBits(x);
                result = prime * result + (int) (temp ^ (temp >>> 32));
                temp = java.lang.Double.doubleToLongBits(y);
                result = prime * result + (int) (temp ^ (temp >>> 32));
                return result;
        }

        @Override
        public boolean equals(Object obj) {
                if (this == obj)
                        return true;
                if (!super.equals(obj))
                        return false;
                if (getClass() != obj.getClass())
                        return false;
                FarebnyBod other = (FarebnyBod) obj;
                if (farba == null) {
                        if (other.farba != null)
                                return false;
                } else if (!farba.equals(other.farba))
                        return false;
                if (java.lang.Double.doubleToLongBits(x) != java.lang.Double
                                .doubleToLongBits(other.x))
                        return false;
                if (java.lang.Double.doubleToLongBits(y) != java.lang.Double
                                .doubleToLongBits(other.y))
                        return false;
                return true;
        }

        @Override
        public double getX() {
                return x;
        }

        @Override
        public double getY() {
                return y;
        }

        public Color getFarba() {
                return farba;
        }

        @Override
        public void setLocation(double x, double y) {
                this.x = x;
                this.y = y;
        }

        @Override
        public int compareTo(FarebnyBod bod) {
                return farba.getRGB() - bod.farba.getRGB();
        }
}
package sk.upjs.test;

import java.awt.Color;
import java.io.File;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Scanner;

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

public class ZoznamBodov {

        private List<FarebnyBod> body = new ArrayList<FarebnyBod>();

        public ZoznamBodov() {
        }

        public ZoznamBodov(double minX, double minY, double maxX, double maxY,
                        int pocet) {
                for (int i = 0; i < pocet; i++) {
                        double x = minX + Math.random() * (maxX - minX);
                        double y = minY + Math.random() * (maxY - minY);

                        pridaj(new FarebnyBod(x, y));
                }
        }

        public void pridaj(FarebnyBod fb) {
                body.add(fb);
        }

        public void vymaz(FarebnyBod fb) {
                body.remove(fb);
        }

        public void vykresli(Pane plocha) {
                // vytvorime korytnacku a pridame do plochy
                Turtle kreslic = new Turtle();
                plocha.add(kreslic);
                kreslic.setVisible(false);

                // kreslenie bodov
                for (FarebnyBod bod : body) {
                        kreslic.setPosition(bod);
                        kreslic.setFillColor(bod.getFarba());

                        kreslic.dot(3);
                }

                // odoberiem korytnacku z plochy
                plocha.remove(kreslic);
        }

        public void zotried() {
                Collections.sort(body);
        }

        public void vypisPocty() {
                Map<Color, Integer> mapa = new HashMap<Color, Integer>();
                for (FarebnyBod bod : body) {
                        // ked zaznam s danou farbou existuje, tak
                        // inkrementujem pocet bodov
                        if (mapa.containsKey(bod.getFarba()))
                                mapa.put(bod.getFarba(), mapa.get(bod.getFarba()) + 1);
                        else // ked neexistuje, tak pridam novy zaznam
                                mapa.put(bod.getFarba(), 1);
                }

                // vypisem zoznam farieb a pocty bodov, ktore maju
                // danu farbu
                for (Color farba : mapa.keySet())
                        System.out.println("RGB(" + farba.getRGB() + ") : " + mapa.get(farba));
        }

        public void odstran(Color farba) {
                List<FarebnyBod> noveBody = new ArrayList<FarebnyBod>(body.size());

                for (FarebnyBod bod : body)
                        if (!bod.getFarba().equals(farba))
                                noveBody.add(bod);

                body = noveBody;
        }

        public FarebnyBod najVStrede(Pane plocha) {
                if (body.size() == 0)   // nemam ani jeden bod
                        return null;

                double sx = plocha.getWidth() / 2;
                double sy = plocha.getHeight() / 2;

                double minVzdialenost = Double.POSITIVE_INFINITY;
                int idx = -1;

                for (int i = 0; i < body.size(); i++) {
                        double vzd = body.get(i).vzdialenostK(sx, sy);
                        if (vzd < minVzdialenost) {
                                minVzdialenost = vzd;
                                idx = i;
                        }
                }

                // TODO: nakreslit kruh okolo toho bodu

                return body.get(idx);
        }

        public void ulozBody(File subor) {
                PrintWriter pw = null;
                try {
                        pw = new PrintWriter(subor);

                        // zapisem vsetky body
                        pw.print(toString());
                } catch (Exception e) {
                        e.printStackTrace();
                } finally {
                        if (pw != null)
                                pw.close();
                }
        }

        public void nacitajBody(File subor) {
                body.clear();

                Scanner s = null;
                try {
                        s = new Scanner(subor);
                        s.useLocale(Locale.US);

                        while (s.hasNextLine()) {
                                double x = s.nextDouble();
                                double y = s.nextDouble();
                                Color farba = new Color(s.nextInt());

                                pridaj(new FarebnyBod(x, y, farba));

                                if (s.hasNextLine())
                                        s.nextLine();
                        }
                } catch (Exception e) {
                        e.printStackTrace();
                } finally {
                        if (s != null)
                                s.close();
                }
        }

        @Override
        public String toString() {
                StringBuilder sb = new StringBuilder();

                for (FarebnyBod bod : body)
                        sb.append(bod.toString() + "\n");

                return sb.toString();
        }
}