import java.awt.*; import javax.swing.*; import java.awt.event.*; import java.applet.*; import java.awt.image.BufferedImage; class PlochaF extends JComponent implements MouseListener, MouseMotionListener { double x1=-2.0, y1=-2.0, x2=2.0, y2=2.0; //okno pohľadu double cx, cy; //konštanty pre Juliovu množinu int pX,pY,curX,curY; //súradnice stlačenia static int sizeX=40,sizeY=40; //rozmery okna int typ = 1; BufferedImage bi=null; //zapamätaný obrázok boolean changed; //či treba prepočítať PlochaF() { changed = true; addMouseMotionListener(this); addMouseListener(this); } public void paint(Graphics g) { if(changed) { sizeX = this.getWidth(); sizeY = this.getHeight(); if(bi==null) bi = new BufferedImage(sizeX,sizeY,BufferedImage.TYPE_INT_RGB); double x=x1, y; double dx=(x2-x1)/sizeX; double dy=(y2-y1)/sizeY; for(int xc=0;xc255) col=255; //hodnoty r,g,b sú 0..255 if(col<0) col = 0; return (int) col; } Color fract(double x1,double y1,double cx,double cy) { double x0; if(typ==1) { //pre Mandelbrotov fraktal cx = x1; cy = y1; x1 = 0.0; y1 = 0.0; x0 = 0.0; } else { //pre Juliovu mnozinu x0 = x1; x1 = x0; y1 = y1; } int d; for(d=0;d<201;d++) { //max. 200 iterácií x1=x1*x1-y1*y1+cx; //výpočet nového z y1=2*x0*y1+cy; if(x1*x1+y1*y1>4) break; x0=x1; } return new Color(col(d,20,180),col(d,60,120),col(d,150,140)); } //odpovede na klikanie myšou public void mouseExited(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseReleased(MouseEvent e) { int rX = e.getX(); int rY = e.getY(); if((rX-pX>2)&&(rY-pY>2)) { if(rX-pX>rY-pY) rY = pY + rX - pX; //aby pohľad bol štvorcový if(rY-pY>rX-pX) rX = pX + rY - pY; double xs=x1, ys=y1; x1=x1+pX*(x2-x1)/sizeX; //nové okno pohľadu y1=y1+pY*(y2-y1)/sizeY; x2=xs+rX*(x2-xs)/sizeX; y2=ys+rY*(y2-ys)/sizeY; pX = 0; pY = 0; curX = 0; curY = 0; changed = true; repaint(); } } public void mousePressed(MouseEvent e) { pX = e.getX(); pY = e.getY(); } public void mouseClicked(MouseEvent e) { if(e.getButton()==MouseEvent.BUTTON1) { double xs=x1, ys=y1; x1=x1-(x2-x1)/2; //zoom out y1=y1-(y2-y1)/2; x2=x2+(x2-xs)/2; y2=y2+(y2-ys)/2; changed = true; repaint(); } } //nutné pre MouseMotionListener: public void mouseMoved(MouseEvent e) {} public void mouseDragged(MouseEvent e) { //vyznačovanie okna curX = e.getX(); curY = e.getY(); repaint(); } } //koniec triedy PlochaF public class Fractal extends JApplet implements ActionListener { protected JButton tlacitko; protected JButton tlacitko2; protected PlochaF plocha; public void init() { plocha = new PlochaF(); plocha.setBounds(0,50,400,400); tlacitko = new JButton("Julia"); tlacitko.setBounds(10,10,110,30); tlacitko.addActionListener(this); setLayout(null); add(tlacitko); add(plocha); } public void actionPerformed(ActionEvent e) { if(e.getActionCommand().equals("Julia")) { //Juliova mnozina tlacitko.setText("Mandelbrot"); plocha.cx = (plocha.x1 + plocha.x2)/2; plocha.cy = (plocha.y1 + plocha.y2)/2; plocha.x1 = -2; plocha.x2 = 2; plocha.y1 = -2; plocha.y2 = 2; plocha.typ = 2; plocha.changed = true; plocha.repaint(); } if(e.getActionCommand().equals("Mandelbrot")) { //Mandelbrotova mnozina tlacitko.setText("Julia"); plocha.x1 = -2; plocha.x2 = 2; plocha.y1 = -2; plocha.y2 = 2; plocha.typ = 1; plocha.changed = true; plocha.repaint(); } } }