package esimerkit; import java.awt.Graphics; import java.awt.SystemColor; import fi.jyu.mit.graphics.BasicShape; import fi.jyu.mit.graphics.Drawable; import fi.jyu.mit.graphics.EasyWindow; import fi.jyu.mit.graphics.Matrix; import fi.jyu.mit.graphics.RPoint; import fi.jyu.mit.graphics.SPoint; import fi.jyu.mit.graphics.Vector; /** * @author vesal * @version 17.8.2009 */ public class GraafinenRekursio { /** * @param window * @param x * @param y * @param kpl */ public static void piirraSisakkaisiaYmpyroita(EasyWindow window, double x, double y, int kpl) { if ( kpl == 0 ) return; double r = 10.0 * kpl; window.addCircle(x, y, r); piirraSisakkaisiaYmpyroita(window, x, y, --kpl); System.out.println("x"); } /** * Piirtää kolmion EasyWindow-ikkunaan parametrinaan saamiinsa * pisteisiin * @param window ikkuna johon piirretään * @param x kolmion kärkipiste * @param y kolmion kärkpiste * @param z kolmion kärkipiste * @return false jos virhe */ public static boolean piirraKolmio(EasyWindow window, double[] x, double[] y, double[] z) { try { window.addLine(x[0], x[1], y[0], y[1]); window.addLine(y[0], y[1], z[0], z[1]); window.addLine(z[0], z[1], x[0], x[1]); } catch (NullPointerException e) { System.out.println("Virhe: " + e); return false; } return true; } final static double PIENIN_KOLMIO = 0.1; /** * Piirtää Sierpinskin kolmion. Parametreina kolmion vasemman alakulman * x- ja y-koordinaatit, sekä kolmoin korkeus. * @param window ikkuna johon piirretään * @param x kolmion vasemman kulman x-koordinaatti * @param y kolmion vasemman kulman y-koordinaatti * @param h kolmion korkeus */ public static void sierpinskinKolmio(EasyWindow window, double x, double y, double h) { //s on kolmion sivun pituus //MAOL: tasasivuisen kolmion kaavat double s = (2*h / (Math.sqrt(3))); window.addLine(x, y, x+s/2, y-h); //vasen sivu window.addLine(x, y, x+s, y); //pohja window.addLine(x+s, y, x+s/2, y-h); //oikea sivu //Viivettä piirtämiseen // try { // Thread.sleep(100); // } catch (InterruptedException e) { // e.printStackTrace(); // } if (h < PIENIN_KOLMIO) return; sierpinskinKolmio(window, x, y, h/2); //Vasen alakolmio sierpinskinKolmio(window, x+s/4, y-h/2, h/2); //Yläkolmio sierpinskinKolmio(window, x+s/2, y, h/2); //Oikea alakolmio } /** * Luokka Sierpinskin kolmion piirtämiseksi niin, että * se on vain yksi objekti. * @author vesal * @version 17.8.2009 */ public static class SierpinskinKolmio extends BasicShape implements Drawable { private double x; private double y; private double h; /** * Alustetaan Sierpipnskin kolmio * @param x kärjen x-koordinaatti * @param y kärjen y-koordinaatti * @param h kolmion korkeus */ public SierpinskinKolmio(double x, double y, double h) { this.x = x; this.y = y; this.h = h; } private void kolmio(Graphics g, Matrix a, double x, double y, double h ) { double s2 = h / (Math.sqrt(3)); SPoint p1 = a.transform(new RPoint(x, y)); SPoint p2 = a.transform(new RPoint(x-s2, y-h)); SPoint p3 = a.transform(new RPoint(x+s2, y-h)); g.drawLine(p1.getX(), p1.getY(), p2.getX(), p2.getY()); g.drawLine(p2.getX(), p2.getY(), p3.getX(), p3.getY()); g.drawLine(p3.getX(), p3.getY(), p1.getX(), p1.getY()); if (h < PIENIN_KOLMIO) return; kolmio(g, a, x-s2, y , h/2); // Vasen alakolmio kolmio(g, a, x+s2, y , h/2); // Oikea alakolmio kolmio(g, a, x , y-h, h/2); // Yläkolmio } /** * * @param g * @param a */ protected void drawShape(Graphics g, Matrix a) { kolmio(g,a,x,y,h); } } /** * Luokka Sierpinskin kolmion piirtämiseksi niin, että * se on vain yksi objekti. * @author vesal * @version 17.8.2009 */ public static class SierpinskinKolmio2 extends BasicShape implements Drawable { private double x; private double y; private double h; /** * Alustetaan Sierpipnskin kolmio * @param x kärjen x-koordinaatti * @param y kärjen y-koordinaatti * @param h kolmion korkeus */ public SierpinskinKolmio2(double x, double y, double h) { this.x = x; this.y = y; this.h = h; } private static class PiirraKolmio { Vector vr = new Vector(); // NOPMD SPoint p1 = new SPoint(0,0); SPoint p2 = new SPoint(0,0); SPoint p3 = new SPoint(0,0); Graphics g; Matrix a; private PiirraKolmio(Graphics g, Matrix a) { this.g = g; this.a = a; } private void kolmio(double x, double y, double h ) { double s2 = h / (Math.sqrt(3)); a.transform(vr.set(x,y) ,p1); a.transform(vr.set(x-s2, y-h),p2); a.transform(vr.set(x+s2, y-h),p3); g.drawLine(p1.getX(), p1.getY(), p2.getX(), p2.getY()); g.drawLine(p2.getX(), p2.getY(), p3.getX(), p3.getY()); g.drawLine(p3.getX(), p3.getY(), p1.getX(), p1.getY()); if (h < PIENIN_KOLMIO) return; kolmio(x-s2, y , h/2); // Vasen alakolmio kolmio(x+s2, y , h/2); // Oikea alakolmio kolmio(x , y-h, h/2); // Yläkolmio } } /** * * @param g * @param a */ protected void drawShape(Graphics g, Matrix a) { PiirraKolmio kolmio = new PiirraKolmio(g, a); kolmio.kolmio(x,y,h); } } /** * Piirretään rekursiivinen kuvio * @param args ei käytössä */ public static void main(String[] args) { /*EasyWindow window = new EasyWindow(); window.showWindow(); sierpinskinKolmio(window, 0, 200, 200);*/ EasyWindow window1 = new EasyWindow(); window1.showWindow(); long alkuAikaOlio = System.currentTimeMillis(); window1.add(new SierpinskinKolmio2(250, 450, 200)); long loppuAikaOlio = System.currentTimeMillis(); System.out.println("Oliototetuksella kesti: " + (loppuAikaOlio - alkuAikaOlio) + " millisekuntia"); EasyWindow window2 = new EasyWindow(); window2.showWindow(); long alkuAika = System.currentTimeMillis(); sierpinskinKolmio(window2, 0, 200, 200); long loppuAika = System.currentTimeMillis(); System.out.println("Monisteessa tehdyllä totetuksella kesti taas: " + (loppuAika - alkuAika) + " millisekuntia"); //piirraKolmio(window, huippu, vasenKulma, oikeaKulma); // sierpinskinKolmio(window, huippu , vasenKulma, oikeaKulma, 20); //window.add(new SierpinskinKolmio(250, 450, 200)); //window.add(new SierpinskinKolmio2(250, 450, 200)); } }