2013-10-30 3 views
4

현재 문제가 해결되었습니다. 색깔이있는 프랙탈을보고 싶은 사람이 있다면 the code is here. 나는 작은 오류 (일부 도형이 제대로 그리는 일부는 아니다)가있는 것, 그럼에도 불구하고 알고리즘이 정직Julia JS 캔바스 구현

:

다음은 이전의 문제입니다. 당신은 jsFiddle에서 그것을 c = -1, 1/4로 정확하게 검사 할 수 있습니다. 그러나 프랙탈이 올바르게 그려지지만 c = i를 취하면됩니다. 이미지가 완전히 잘못되었습니다.

여기 구현되었습니다.

는 그것을 작성하는 나에게 몇 분이 걸렸다 또한

function point(pos, canvas){ 
    canvas.fillRect(pos[0], pos[1], 1, 1); // there is no drawpoint in JS, so I simulate it 
} 

function conversion(x, y, width, R){ // transformation from canvas coordinates to XY plane 
    var m = R/width; 
    var x1 = m * (2 * x - width); 
    var y2 = m * (width - 2 * y); 
    return [x1, y2]; 
} 

function f(z, c){ // calculate the value of the function with complex arguments. 
    return [z[0]*z[0] - z[1] * z[1] + c[0], 2 * z[0] * z[1] + c[1]]; 
} 

function abs(z){ // absolute value of a complex number 
    return Math.sqrt(z[0]*z[0] + z[1]*z[1]); 
} 

function init(){ 
    var length = 400, 
     width = 400, 
     c = [-1, 0], // all complex number are in the form of [x, y] which means x + i*y 
     maxIterate = 100, 
     R = (1 + Math.sqrt(1+4*abs(c)))/2, 
     z; 

    var canvas = document.getElementById('a').getContext("2d"); 

    var flag; 
    for (var x = 0; x < width; x++){ 
     for (var y = 0; y < length; y++){ // for every point in the canvas plane 
      flag = true; 
      z = conversion(x, y, width, R); // convert it to XY plane 
      for (var i = 0; i < maxIterate; i++){ // I know I can change it to while and remove this flag. 
       z = f(z, c); 
       if (abs(z) > R){ // if during every one of the iterations we have value bigger then R, do not draw this point. 
        flag = false; 
        break; 
       } 
      } 
      // if the 
      if (flag) point([x, y], canvas); 
     } 
    } 
} 

HTML

<canvas id="a" width="400" height="400"></canvas> 

JS, 나는 왜 모든 작동하지 않는 것을 발견하려고 많은 시간을 보냈다 사례. 내가 망 쳤던 어떤 생각?

답변

4

좋은 소식! (또는 나쁜 소식)

구현이 완전합니다. 옳은. 불행하게도, c = [0, 1]으로, Julia 세트는 거의 포인트가 없습니다. 나는 이것이 measure zero (Mandelbrot 세트와는 달리)이라고 생각한다. 따라서 줄리아 세트에 임의의 점이있을 확률은 0입니다.

반복을 15 (JSFiddle)로 줄이면 프랙탈이 보입니다. 100 회 반복이 더 정확하지만 반복 횟수가 늘어남에 따라 400x400 격자의 한 점이 프랙탈 근사에 포함될 가능성이 0으로 줄어 듭니다.

종종, 줄리아 프랙탈은 여러 색상을 볼 수 있습니다.이 색상은이 Flash demonstration에서와 같이 색상이 얼마나 빨리 다른 색상으로 나뉘는지를 나타냅니다. 이렇게하면 Julia 프랙탈이 c = i와 같은 경우에도 어느 정도 보이게됩니다.

당신의 선택은

(1) 가능 c에 따라 반복하여 #을 줄일 수 있습니다.

(2) 샘플링 및 캔버스 크기를 늘리십시오 (가능하면 c에 따라 다름).

(3) R을 초과하는 반복 횟수에 따라 캔버스의 포인트에 색을 지정하십시오.

마지막 옵션은 가장 강력한 결과를 제공합니다.