2013-03-28 75 views
0

所以我一直在嘗試編程在java中的mandelbrot集,我知道代碼不是非常優化,但我剛開始這樣做。java mandelbrot set moving wrong

這個想法是,當我點擊一個像素,它會把該像素放在中心(表示一個複數),並計算它周圍的集合。這工作在一開始,但如果我放大它會開始表現怪異。我猜這是我的midX,midY或顯示功能,這很奇怪,但我一直在尋找它很長一段時間,無法弄清楚,希望能得到一些幫助。

class set { 
    DotWindow w; 
    int[][] arrayColor; 
    int max = 100; 
    Grayscale gray; 
    double zoom = 1.1; 
    double midX = -0.5; 
    double midY = 0; 

    public static void main(String[] args) { 
     new set().run(); 
    } 

    void run() { 
     setup(); 
     runLoop(); 

    } 

    void runLoop() { 
     int x; 
     int y; 
     while (true) { 
      GameEvent event = w.getNextEvent(); 
      switch (event.getKind()) { 
      case GameEvent.KEY_PRESSED: 
       int key = event.getKey(); 
       if (key == 43) { 
        zoom = zoom * 1.1; 
       } else if (key == 45) { 
        zoom = zoom/1.1; 
       } 

       display(); 
       break; 
      case GameEvent.MOUSE_CLICKED: 
       midX = midX - (1 - event.getX()/250.0); 
       midY = midY - (1 - event.getY()/250.0); 
       System.out.println(midX); 
       display(); 
       break; 
      } 

     } 
    } 

    void setup() { 
     w = new DotWindow(500, 500, 1); 
     w.checkMouse(true, false, false, false, false); 
     w.checkKeys(true, false, false); 
     arrayColor = new int[500][500]; 
     zoom = zoom/1.1; 
     display(); 

    } 

    int calculate(double re, double im) { 
     double Zre = 0; 
     double Zim = 0; 
     double Zim2 = 0; 
     double Zre2 = 0; 
     int iterations = 0; 

     for (int k = 0; k < max; k++) { 
      if (Zre2 + Zim2 > 4.0) { 
       return k; 
      } 
      Zim2 = Zim * Zim; 
      Zre2 = Zre * Zre; 
      Zim = 2.0 * Zre * Zim + im; 
      Zre = Zre2 - Zim2 + re; 
      iterations = k; 
     } 
     return iterations; 

    } 

    void display() { 
     for (double y = 0; y < 500; y++) { 
      for (double x = 0; x < 500; x++) { 
       double value = calculate((midX - (1 - x/250)/zoom), 
         (midY - (1 - y/250)/zoom)); 
       if (value == 99) { 
        w.setDot((int) x, (int) y, Color.BLACK); 
       } else { 
        w.setDot((int) x, (int) y, gray = new Grayscale(
          255 - (int) value * 2)); 
       } 

      } 

     } 
    } 

} 
+0

您是否介意以最好的截圖形式顯示您收到的錯誤行爲? – Vesper 2013-03-28 10:19:38

+2

在Eclipse中CTRL + SHIFT + F有助於:)在SO上添加JAVA標記有助於*很多*;) – 2013-03-28 10:20:13

+0

謝謝:)嗯,截圖並沒有真正解釋它,因爲它看起來是正確的,但是當你移動它時正確移動。如果我放大幾倍,它不會把我點擊的像素放在中心。似乎只有在放大倍數不太大的情況下才有效。 – poffsan 2013-03-28 10:35:05

回答

0
 case GameEvent.MOUSE_CLICKED: 
      midX = midX - (1 - event.getX()/250.0)/zoom; 
      midY = midY - (1 - event.getY()/250.0)/zoom; 
      System.out.println(midX); 
      display(); 

你已經放大,說10倍,但你不改變關於所述變焦值中心座標。