2017-03-05 2 views
1

Ich versuche, ein Mandelbrot-Programm zu machen, das Zoom erlaubt, aber der Zoom scheint nicht zu funktionieren, und ich sehe nicht, was falsch ist mit der Art, wie ich den Zoom implementiert habe verwende Eclipse und das Programm gibt keine Fehler zurück. Hier ist mein Code:Zoomen mit dem Scrollrad in 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; 

       } } }); 

      } } 

Antwort

0
  1. Ihr Konstruktor enthält eine Endlosschleife. Es wird daher nie zurückgegeben und Ihre MouseWheelListener wird nie zum Rahmen hinzugefügt.

  2. Sie berechnen die BufferedImage genau einmal (vor der Endlosschleife), also selbst wenn Sie die MouseWheelListener vor der Schleife anhängen würde es keinen Effekt haben.

Ich würde die Berechnung des Bildes in seine eigene Methode, rufen Sie diese Methode einmal aus dem Konstruktor und einmal von Ihrem MouseWheelListener und entfernen Sie die Endlos-Schleife aus dem Konstruktor bewegen.

 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(); 
       } 
      }); 
     }