2017-03-17 3 views
0

現在、マンデルブロセットを生成するプログラムをコーディングしようとしています。しかし、私はそれぞれの方法で多くのテストをしましたが。セット全体の形状が間違っているようです。私は助けを求めており、誰かがそれを修正する方法を知っていれば本当にうれしいでしょう。マンデルブローの形状が正しくない

import java.awt.*; 
import javax.swing.*; 

public class MandelbrotMenge extends JComponent { 

    int WIDTH = 600; 
    int HEIGHT = 600; 
    static int n = 1; // anzahl iterationen 

    static double a; // reeller Anteil von komplexer Zahl 
    static double b; // imaginärer Anteil 

    public MandelbrotMenge(int p_n) { 
     setSize(WIDTH, HEIGHT); 
     n = p_n; 
    } 

    public static boolean isMandelbrot(double a_n, double b_n, int n) { // prüft 
     // ob 
     // komplexe 
     // zahl 
     // divergiert 
     a = a_n; 
     b = b_n; 
     double a2 ; 
     for (int i = 0; i < n; i++) { 
      a2 = a * a - b * b + a;  
      b = 2 * a * b + b; 
      a=a2; 
      if (a * a + b * b >= 4) 
       return false; 
     } 
     return true;  
    } 

    public static void zeichneMandelbrot(Graphics g,int n) {  
     for (int i = 100; i <= 600; i++) { 
      for (int j = 0; j <= 600; j++) {  
       // i ist pixel und j auch 

       // komplexe zahl: 
       a = -3 + 0.01 * i; // x min = -3 x max = 6 pixel =600 --> 0.01*i 
       b = 3 - 0.01 * j; 

       if (isMandelbrot(a, b, n)) { 
        g.setColor(Color.white); 
       } else { 
        g.setColor(Color.black); 
       } 
       g.drawLine(i, j, i, j);  
      }  
     }  
    } 

    protected void paintComponent(Graphics g) { 
     zeichneMandelbrot(g, n); 
    } 
} 

形状ルックス(ない完全に)間違っ:

enter image description here

+0

「n」のどの値を使用していますか? –

答えて

3

数学的にあなたが初期値の500 500ピクセルのグリッドから特定の機能f(z)=z^2+zを反復して何を生成している、話しますまさしくその機能のジュリアセットです。マンデルブロセットを生成するには、f(z)=z^2+cを反復する必要がありますが、グリッド全体にわたってパラメータcを使用させながら、常に同じ初期ポイント0を使用します。

したがって、代わりに

a = a_n; 
    b = b_n; 
    double a2 ; 
    for (int i = 0; i < n; i++) { 
     a2 = a * a - b * b + a;  
     b = 2 * a * b + b; 
     a=a2; 
     ... 
    } 

のあなたはz_az_bc_ac_bながら、複雑な変数zの実部と虚部を表し、このコードでは

z_a = 0; 
    z_b = 0; 
    a = c_a 
    b = c_b 
    double z_a2 ; 
    for (int i = 0; i < n; i++) { 
     a2 = z_a * z_a - z_b * z_b + a;  
     b = 2 * z_a * z_b + b; 
     a=a2; 
     ... 
    } 

ようなものが必要だろう複素パラメータcの実数部と虚数部を表します。反復は常にゼロから始まります。そのため、最初にz_az_bの両方がゼロに設定されています。ただし、パラメータcは変更されます。

関連する問題