2017-03-05 75 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(); 
       } 
      }); 
     } 
相关问题