2017-03-05 12 views
1

ズームが可能なマンデルブロプログラムを作成しようとしていますが、ズームが機能していないようで、ズーム機能を実装した方法が間違っていません。 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(); 
       } 
      }); 
     } 
関連する問題