Как увеличить множество Мандельброта?

Я могу сгенерировать изображение множества Мандельброта размером 400x400 от minReal до maxReal и от minImaginary до maxImaginary. Так,

makeMandel(minReal, maxReal, minImaginary, maxImaginary);

Мне нужно изменить его, чтобы я мог,

makeMandel(centerX, centerY, Zoomlevel);
// generates a region of the mandelbrot set centered at centerX,centerY at a zoom level of Zoomlevel

(Учитывая, что уровень масштабирования представляет собой расстояние между пикселями и задается формулой Уровень масштабирования n = 2 ^ (-n), так что уровень масштабирования 1 означает, что пиксели находятся на расстоянии 0,5 единицы друг от друга, уровень масштабирования 2, 0,25 и т. д....)

Мой вопрос: как мне рассчитать аргументы первой функции makeMandel из аргументов второй? Я знаю, что первая функция способна масштабировать и перемещаться, но я не знаю, как вычислить правильные числа для любого заданного центра и уровня масштабирования.

Я пытаюсь заставить это работать уже более трех дней, и я действительно запутался. Я пытался рисовать таблицы и т. д. на бумаге и работал над этим. Я прочитал большинство документов, которые вы найдете в Google при поиске набора Мандельброта, и пару прошлых вопросов о стеке, но я все еще не понимаю. Пожалуйста, помогите мне.


person Alex    schedule 16.04.2011    source источник
comment
Поиск множества Мандельбро в этом случае мало чем вам поможет, потому что ваша проблема также относится ко многим областям. У вас просто проблемы с преобразованием координат, вот что вам следует изучить.   -  person Roland Illig    schedule 16.04.2011


Ответы (1)


Вы можете решить это следующим образом. Если у вас есть два определения

centerX = (minReal + maxReal)/2
sizeX = maxReal - minReal

вы можете рассчитать расширение на оси через

minReal = centerX - sizeX/2
maxReal = centerX + sizeX/2

Затем размер рассчитывается с использованием zoomLevel:

sizeX = 2^(-zoomLevel) * baseSize

Те же формулы справедливы для y и мнимой оси.

sizeY = 2^(-zoomLevel) * baseSize   
minImaginary = centerY - sizeY/2
maxImaginary = centerY + sizeY/2

Единственное, что можно определить как константу, — это ваш baseSize, т. е. расширение реальной и мнимой осей, когда zoomLevel равно нулю. Вы можете рассмотреть разные baseSize в реальном и воображаемом направлении, чтобы охватить неквадратное соотношение сторон вашего изображения.

person Howard    schedule 16.04.2011
comment
так что для квадратного изображения unitSize будет 1? Извините, я не понимаю, почему sizeX равняется двум разным формулам - person Alex; 16.04.2011
comment
Он не равен двум разным формулам (первая автоматически идет по определению). baseSize — это просто коэффициент масштабирования. Если ваша реальная ось изменяется от -2 до 2 в случае zoomLevel=0 (чтобы охватить весь набор), у вас есть sizeX = 4 и, следовательно, baseSize = 4. - person Howard; 16.04.2011