Как увеличить набор Мандельброта
Я успешно реализовал набор mandelbrot, как описано в статье в Википедии, но я не знаю, как увеличить конкретный раздел. Это код, который я использую:
+(void)createSetWithWidth:(int)width Height:(int)height Thing:(void(^)(int, int, int, int))thing
{
for (int i = 0; i < height; ++i)
for (int j = 0; j < width; ++j)
{
double x0 = ((4.0f * (i - (height / 2))) / (height)) - 0.0f;
double y0 = ((4.0f * (j - (width / 2))) / (width)) + 0.0f;
double x = 0.0f;
double y = 0.0f;
int iteration = 0;
int max_iteration = 15;
while ((((x * x) + (y * y)) <= 4.0f) && (iteration < max_iteration))
{
double xtemp = ((x * x) - (y * y)) + x0;
y = ((2.0f * x) * y) + y0;
x = xtemp;
iteration += 1;
}
thing(j, i, iteration, max_iteration);
}
}
Насколько я понимаю, x0 должно быть в диапазоне -2,5 - 1, а y0 должно быть в диапазоне -1 - 1, и что уменьшение этого числа приведет к увеличению, но на самом деле это не сработало. Как я могу увеличить?
2 ответа
Во -первых, с max_iteration 15 вы не увидите подробностей. у меня есть 1000 итераций на точку в качестве базовой линии, и он может перейти к 8000 итераций, прежде чем он станет слишком медленным, чтобы ждать.
это может помочь: http://jc.unternet.net/src/java/com/jcomeau/Mandelbrot.java
это тоже: http://www.wikihow.com/Plot-the-Mandelbrot-Set-By-Hand
Предположим, что центром является (cx, cy), а длина, которую вы хотите отобразить, (lx, ly), вы можете использовать следующую формулу масштабирования:
x0 = cx + (i / width - 0.5) * lx;
y0 = cy + (j / width - 0.5) * ly;
Для этого сначала нужно уменьшить масштаб пикселя до единичного интервала (0 <= i/width < 1), а затем сместить центр (-0.5 <= i / width-0.5 <0.5), масштабировать до желаемого размера (-0,5 * лк <= (i / ширина-0,5) * лк <0,5 * лк). Наконец, сдвиньте его в центр, который вы дали.