2017-03-17 2 views
0

J'essaye actuellement de coder un programme qui génère un ensemble mandelbrot. Cependant, même si j'ai fait beaucoup de tests avec chaque méthode unique. La forme de l'ensemble semble être fausse. Je cherche de l'aide et serait vraiment heureux si quelqu'un sait comment y remédier.Mandelbrot Set Wrong Shape

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

Les regards de forme (pas complètement) mal:

enter image description here

+0

Quelle est la valeur de 'n' que vous utilisez? –

Répondre

3

Mathématiquement parlant, vous itérez la fonction spécifique f(z)=z^2+z de 500 par 500 grille de pixels des valeurs initiales et ce que vous avez généré est exactement l'ensemble Julia de cette fonction. Pour générer l'ensemble Mandelbrot, vous devez répéter f(z)=z^2+c, mais maintenant, vous utilisez toujours le même point initial 0 alors que vous laissez le paramètre c parcourir une grille.

Ainsi, au lieu de

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; 
     ... 
    } 

Vous auriez besoin de quelque chose comme

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; 
     ... 
    } 

Dans ce code, z_a et z_b représentent les parties réelles et imaginaires de la variable complexe z tout c_a et c_b représentent les parties réelles et imaginaires du paramètre complexe c. L'itération commence toujours à partir de zéro, c'est pourquoi z_a et z_b sont tous deux mis à zéro au début. Le paramètre c change cependant.