2016-12-10 23 views
2

Я сделал этот простой генератор Мандельброта в Javascript вчера вечером, но он выводит действительно странную структуру. Я думаю, что он похож на набор мандельбротов, но странно деформирован. Я понятия не имею, почему это так искажается, и я пытался узнать весь день. Кто-нибудь знает, что вызывает это и как это исправить?Failed JS Mandelbrot Установить генератор выдает нечетную структуру

c = document.getElementById("canvas"); 
ctx = c.getContext("2d"); 
c.width = 4000; 
c.height = 4000; 

declareVariables(); 
calculateShape(); 
drawShape(); 

function declareVariables() { 
    Re = -2; 
    Im = -2; 
    input = [Re,Im]; 
    precision = prompt("input precision (higher is better)"); 
    precision = 1/(precision - precision%4); 
    segmentAmt = 4/precision; 
    segmentSize = c.width/segmentAmt; 
    iterate = prompt("input test amount (higher is better)"); 
    set = []; 
    for (i=0; i<segmentAmt; i++) { 
     set[i] = []; 
    } 
    numberGrid = []; 
    for (i=0; i<segmentAmt; i++) { 
     numberGrid[i] = []; 
     for (j=0; j<segmentAmt; j++) { 

     } 
    } 
} 

function calculateShape() { 
    for (i=0; i<segmentAmt; i++) { 
     input[1] = -2; 
     input[0] += precision; 
     for (j=0; j<segmentAmt; j++) { 
      input[1] += precision; 
      set[i][j] = 0; 
      z = [0,0]; 
      for (k=1; k<=iterate; k++) { 
       store = z; 
       z[0] = store[0]**2 - store[1]**2 + input[0]; 
       z[1] = 2 * store[0] * store[1] + input[1]; 
       if (z[0]**2 + z[1]**2 > 4) { 
        set[i][j] = k; 
        k = iterate+1; 
       } 
      } 
     } 
    } 
} 

function drawShape() { 
    ctx.fillStyle = "white"; 
    ctx.fillRect(0,0,c.width,c.height); 
    for (i=0; i<segmentAmt; i++) { 
     for (j=0; j<segmentAmt; j++) { 
      if (set[i][j] == 0) { 
       ctx.fillStyle = "black"; 
      } else if (set[i][j] >= 1) { 
       ctx.fillStyle = 'hsl(' + (25*(set[i][j]-1))**0.75 + ', 100%, 50%)'; 
      } 
      convertCoords(i,j); 
      ctx.fillRect(xCoord,yCoord,segmentSize,segmentSize); 
     } 
    } 
} 

function convertCoords(var1,var2) { 
    xCoord = var1 * segmentSize; 
    yCoord = var2 * segmentSize; 
} 

Вывод изображения:

output image

ответ

2

появляется ошибка, чтобы быть на этой линии в calculateShape():

   store = z; 

Кажется, что вы хотите store быть копией от z, но это только заканчивается store и z, ссылаясь на тот же массив. Следующая строка вычисляет z[0], но как store и z относится к тому же массиву, store[0] имеет новое значение z[0], а не предыдущее. Следовательно, вычисление z[1] в строке после этого неверно.

Замените эту строку либо

   store = [z[0], z[1]]; 

или

   store = z.slice(); 

Обе эти линии обеспечивают, что store относится к другому массива z, поэтому, когда вы пересчитывать z[0], store[0] не влияет.