2017-03-17 11 views
0

현재 mandelbrot-set을 생성하는 프로그램을 코딩하려고합니다. 그러나 비록 내가 각 단일 방법으로 많은 테스트를 했더라도. 전체 세트의 모양이 틀린 것 같습니다. 도움을 요청하고 누군가 그것을 수정하는 방법을 알고 있다면 정말 기쁠 것입니다.Mandelbrot 잘못된 모양 설정

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을 반복해야하지만 이제는 표 초기에 항상 0을 사용합니다. c 범위는 그리드 전체에 걸쳐 있습니다.

따라서, 대신

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의 실수 부와 허수 부를 나타냅니다. 반복은 항상 0에서 시작하기 때문에 처음에는 z_az_b이 모두 0으로 설정됩니다. 매개 변수 c은 변경됩니다.