2016-12-10 1 views
-1

만델 브로 프랙털을 생성하는 방정식은 Zn+1 = Zn^2+C입니다. 문제는 컴퓨터 프로그램에서 C가 화면의 줌/해상도 및 위치에 사용된다는 것입니다. (Rosetta Code에서)Mandelbrot 프랙탈을 생성 할 때 C 값을 어떻게 설정할 수 있습니까?

Wolfram

(equation f(z) = sin(z/c), z0 = c)

cassinioval

내 코드 : 제 질문은 내가 이런 프랙탈을 얻을 수 있도록 내가 할 수있는 방법이다

public class MandelbrotSet extends JFrame { 
    private static final long serialVersionUID = 5513426498262284949L; 
    private final int MAX_ITER = 570; 
    private final double ZOOM = 150; 
    private BufferedImage image; 
    private double zx, zy, cX, cY, tmp; 

    public MandelbrotSet() { 
     super("Mandelbrot Set"); 
     setBounds(100, 100, 800, 600); 
     setResizable(false); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     image = 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--; 
       } 

       image.setRGB(x, y, iter | (iter << 8)); 
      } 
     } 
    } 

     @Override 
     public void paint(Graphics g) { 
      g.drawImage(image, 0, 0, this); 
     } 

    public static void main(String[] args) { 
     new MandelbrotSet().setVisible(true);; 
    } 
} 
+1

정확하게 무엇이 질문입니까? 확대/축소 창을 커버하는 지역 변수를 얻는 방법? 또는 복잡한 인수에 대해 사인을 구현하는 방법? 또는 다른 것? – LutzL

답변

1

삼각법 정리에 의한

012 작은 스크립트는 다음과 같이 수있는이 프랙탈을 생성하는 자바 스크립트에서

A = (a*x+b*y)/(a*a+b*b) 
B = (a*y-b*x)/(a*a+b*b) 

위의 사인 표현되도록 z=x+i*y

(x+i*y)/(a+i*b)=(x+i*y)*(a-i*b)/(a*a+b*b) 

c=a+i*b를 사용 3,516,

과 지수에 대한

sin(A+i*B)=sin(A)*cos(i*B)+ cos(A)*sin(i*B) 
      =sin(A)*cosh(B)+i*cos(A)*sinh(B) 
:

function cosh(x) { return 0.5*(Math.exp(x)+Math.exp(-x)); } 
 
function sinh(x) { return 0.5*(Math.exp(x)-Math.exp(-x)); } 
 

 
function rgb(r,g,b) { return "rgb("+r+","+g+","+b+")"; } 
 
var colors = new Array(24); 
 
for(var k=0; k<8; k++) { 
 
    colors[ k] = rgb(k*64,(7-k)*64,(7-k)*64); 
 
    colors[ 8+k] = rgb((7-k)*64,k*64,(7-k)*64); 
 
    colors[16+k] = rgb((7-k)*64,(7-k)*64,k*64); 
 
} 
 

 
var cvs = document.getElementById('sine-fractal'); 
 
var ctx = cvs.getContext('2d'); 
 
var cx = 0.0, cy = 0.0; 
 
var dx = 1.0; 
 

 
var tiles = 100; 
 
var scale = Math.min(cvs.width, cvs.height)/tiles; 
 
ctx.scale(scale, scale); 
 

 
function localx(i) { return cx-dx + 2*i*dx/tiles; } 
 
function localy(j) { return cy-dx + 2*j*dx/tiles; } 
 

 
for (var i = 0; i < tiles; i++) { 
 
    var a = localx(i); 
 
    for (var j = 0; j < tiles; j++) { 
 
    var b = localy(j); 
 
    var r2 = a*a + b*b; 
 
    var x = a, y = b; 
 
    var rounds = 0; 
 
    var max = 500; 
 
    while (x * x + y * y < 4 && rounds < max) { 
 
     var u = (a*x + b*y)/r2, v = (a*y - b*x)/r2; 
 
     x = Math.sin(u) * cosh(v); 
 
     y = Math.cos(u) * sinh(v); 
 
     rounds++; 
 
    } 
 
    ctx.fillStyle = colors[rounds % 24]; 
 
    ctx.fillRect(i, j, 1, 1); 
 
    } 
 
}
<canvas id='sine-fractal' width=200 height=200></canvas>

관련 문제