package demo; import org.eclipse.swt.graphics.*; import org.eclipse.swt.widgets.*; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.layout.FillLayout; // Vertailun vuoksi: // ================================= // koko C Java AWT-versio // ================================= // 0.5 0.32 s 1.3 s 0.38 s // 0.05 8.2 s 23.2 s 7.8 s // ================================= // // Uudempi kone (Java 1.6.0): // =============================================== // koko C Swing Swing2 AWT-versio SWT // =============================================== // 0.05 2.1 s 50.5 s 50.4 s 3.3 s 3.9 s // =============================================== /** * Kolmionpiirto SWT:llä */ public class KolmioPiirtoSWT implements PaintListener { /** Raja pienimmälle kolmiolle joka piirretään */ public static final double PIENIN_KOLMIO = 0.05; /** * Piirretään viiva reaalilukukoordinaateista * @param g piirtopinta johon piirretään * @param x1 viivan alku x * @param y1 viivan alku y * @param x2 viivan loppu x * @param y2 viivan loppu y * */ public static void drawLine(GC g, double x1, double y1, double x2, double y2) { g.drawLine((int) x1, (int) y1, (int) x2, (int) y2); } /** * Rekursiivinen kolmion piirto. Piirretään ensin * kolmio jonka alakärki o pisteessä x,y ja korkeus on h. * Sitten piirretään sen joka sivulle vastaava kolmio- * @param g piirtopinta johon piirretään * @param x kolmion alakärjen x * @param y kolmion alakärjen y * @param h kolmion korkeus */ public static void kolmio(GC g, double x, double y, double h) { double s2 = h / (Math.sqrt(3)); drawLine(g, x, y, x - s2, y - h); drawLine(g, x - s2, y - h, x + s2, y - h); drawLine(g, x + s2, y - h, x, y); if (h < PIENIN_KOLMIO) return; kolmio(g, x - s2, y, h / 2); /* Pienempi kolmio vasemmalle */ kolmio(g, x + s2, y, h / 2); /* Pienempi kolmio oikealle */ kolmio(g, x, y - h, h / 2); /* Pienempi kolmio yläpuolelle */ } private Shell shell = null; /** * Piirretään kolmio * @param e piirtämiseen liittyvä tapahtuma */ public void paintControl(PaintEvent e) { shell.setText("Kolmio..."); long lahto = System.currentTimeMillis(); kolmio(e.gc, 300, 450, 200); long loppu = System.currentTimeMillis(); shell.setText("Kolmio: " + (loppu - lahto) / 1000.0 + " s"); System.out.println("Kolmio(" + this + "): " + (loppu - lahto) / 1000.0 + " s"); } /** * This method initializes sShell */ private void createShell() { shell = new Shell(); shell.setText("Shell"); shell.addPaintListener(this); shell.setSize(new Point(600, 500)); shell.setLayout(new FillLayout()); } /** * Luodaan ikkuna ja aloitetaan viestisilmukka * @param args ei käytössä */ public static void main(String[] args) { Display display = Display.getDefault(); KolmioPiirtoSWT piirto = new KolmioPiirtoSWT(); piirto.createShell(); piirto.shell.open(); // thisClass.sShell.redraw(); while (!piirto.shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); } }