Вот псевдокод того, как я настраиваю массив, представляющий набор Мандельброта, но он становится ужасно растянутым, если оставить соотношение сторон 1: 1.
xStep = (maxX - minX) / width;
yStep = (maxY - minY) / height;
for(i = 0; i < width; i++)
for(j = 0; j < height; j++)
{
constantReal = minReal + xStep * i;
constantImag = minImag + yStep * j;
image[i][j] = inSet(constantReal, constantImag);
}
Спасибо!
Он вычисляет, сколько итераций находится от этой точки, возвращая количество итераций или 0, если она «слишком далеко».





Вероятно, это связано с тем, как вы отображаете массив image. Вы используете переменную ширины i в качестве первого индекса, но обычно первый индекс должен изменяться медленнее всего, то есть высота.
Попробуйте поменять последнюю строчку на image[j][i] = ...
Разве это не перевернуло бы его по горизонтали и вертикали, а не растянуло?
Что еще хуже, он будет записывать в память за пределами массива, если ширина не равна высоте, что и пытается сделать OP!
Убедитесь, что ваши повязки верны. xStep и yStep могут быть продуктами целочисленного деления вместо ожидаемого деления с плавающей запятой (если в вашем примере это C#, для правильной работы потребуется несколько явных приведений).
Here is pseudo-code of how I setup an array representing the MandelBrot set, yet it becomes horribly stretched when leaving an aspect ratio of 1:1.
xStep = (maxX - minX) / width;
yStep = (maxY - minY) / height;
Ага! Это потому, что вы должны сохранить такое же соотношение сторон и то и другое для изображения, которое вы рисуете и для области комплексной плоскости, которую вы хотите нарисовать. Другими словами, он должен удерживать
width maxX - minX
---------- = ---------------------
height maxY - minY
(Отсюда следует, что xStep == yStep.) Вероятно, ваш код не выполняет это требование.
Вот и все! Мне это никогда не приходило в голову. Большое спасибо, чувак. 2: 1 работает, когда у меня есть 2: 1 в пространстве отображения и сложном пространстве.
Вы можете показать, что делает функция inSet.