2017-03-05 91 views
1

我想製作一個允許縮放的Mandelbrot程序,但縮放似乎沒有工作,而且我也沒有看到我實施縮放的方式有什麼問題。我正在使用eclipse,程序不會返回任何錯誤。這裏是我的代碼:在java中使用滾輪縮放

import java.awt.Graphics; 
import java.awt.event.*; 
import java.awt.image.BufferedImage; 
import javax.swing.JFrame; 

public class Mandelbrot extends JFrame { 

      private final int MAX_ITER = 570; 
      private static double ZOOM = 200; 
      private BufferedImage I; 
      private double zx, zy, cX, cY, tmp; 
      public static boolean zooming = false; 
      public Mandelbrot() 
      { 
       super("MandelbrotSet"); 
       setBounds(100, 100, 800, 600); 
       setResizable(false); 
       setDefaultCloseOperation(EXIT_ON_CLOSE); 
       I = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB); 
       for (int y = 0; y < getHeight(); y++) { 
        for (int x = 0; x < getWidth(); x++) { 
         zx = zy = 0; 
         cX = (x - 400)/ZOOM; 
         cY = (y - 300)/ZOOM; 
         int iter = MAX_ITER; 
         while (zx * zx + zy * zy < 4 && iter > 0) { 
          tmp = zx * zx - zy * zy + cX; 
          zy = 2.0 * zx * zy + cY; 
          zx = tmp; 
          iter--; 
         } 
         I.setRGB(x, y, iter | (iter << 8)); 
        } 
       } 
      setVisible(true); 
      while(1>0) 
      { 
       if(zooming) 
       { 
        revalidate(); 
        repaint(); 
        System.out.println("zooming"); 
        zooming = false; 
       } 
      } } 

      @Override 
      public void paint(Graphics g) { 
       g.drawImage(I, 0, 0, this); 
      } 

      public static void main(String[] args) { 
       new Mandelbrot().addMouseWheelListener(new MouseWheelListener(){ public void mouseWheelMoved(MouseWheelEvent 
     e) { 

       if (e.getWheelRotation() < 0) { 
        ZOOM=ZOOM+100; 
        zooming = true; 
       } else 
       { 
        ZOOM=ZOOM-100; 
        zooming = true; 

       } } }); 

      } } 

回答

0
  1. 你的構造函數中包含一個無限循環。因此它永遠不會返回,並且您的MouseWheelListener永遠不會被添加到框架中。

  2. 您只需計算BufferedImage一次(在無限循環之前),因此即使您在循環之前附加MouseWheelListener也不會產生任何影響。

我將畫面的計算移動到它自己的方法,從MouseWheelListener從構造各一次調用此方法並從構造函數的無限循環。

 public Mandelbrot() 
     { 
      super("MandelbrotSet"); 
      //... 
      I = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB); 
      calculatePicture(); 
      setVisible(true); 
     } 
     public void calculatePicture() { 
      for (int y = 0; y < getHeight(); y++) { 
       //... 
      } 
      repaint(); 
     } 
     public static void main(String[] args) { 
      new Mandelbrot().addMouseWheelListener(new MouseWheelListener(){ 
       public void mouseWheelMoved(MouseWheelEvent 
    e) { 
        //... 
        calculatePicture(); 
       } 
      }); 
     }