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

Я успешно реализовал набор Мандельброта, как описано в статье в Википедии, но я не знаю, как увеличить конкретный раздел. Это код, который я использую:

+(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, и что уменьшение этого числа приведет к увеличению масштаба, но на самом деле это вообще не сработало. Как я могу увеличить?


person Nippysaurus    schedule 10.12.2010    source источник
comment
также весь набор содержится в пределах -2 ‹ x ‹ 2, -2 ‹ y ‹ 2. не уверен, что вы имеете в виду с цифрами, которые вы дали.   -  person jcomeau_ictx    schedule 10.12.2010
comment
Я считаю, что для бесконечных зумов используется какое-то свойство самого фрактального алгоритма.   -  person    schedule 10.12.2010


Ответы (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

person jcomeau_ictx    schedule 10.12.2010
comment
Я создавал большой набор и хотел, чтобы он работал быстрее, поэтому уменьшите его до 15 ... раньше было 1000. - person Nippysaurus; 10.12.2010
comment
Чем больше вы увеличиваете масштаб, тем больше итераций вам потребуется, чтобы увидеть различия между точками. Слишком мало итераций, и вы увидите только один цвет. При более высоких масштабах вам потребуется больше итераций, чтобы показать детали. - person Graham Perks; 10.12.2010

Предположим, что центр — это (cx, cy), а длина, которую вы хотите отобразить, — (lx, ly), вы можете использовать следующую формулу масштабирования:

x0 = cx + (i/ширина - 0,5)*lx;

y0 = cy + (j/ширина - 0,5)*ly;

Что он делает, так это сначала уменьшает пиксель до единичного интервала (0 ‹= i/width ‹ 1), затем сдвигает центр (-0,5 ‹= i/width-0,5 ‹ 0,5), масштабирует до желаемого размера ( -0,5*лк ‹= (i/ширина-0,5)*лк ‹ 0,5*лк). Наконец, переместите его в центр, который вы указали.

person unsym    schedule 10.12.2010
comment
Спасибо! Ваш ответ оказался полезным, так как я также столкнулся с необходимостью масштабировать множество Мандельброта. Однако могу я спросить, что означают x0 и y0 в этом случае. Я не знаком с языком C - person Robert Garza-Altuna; 09.05.2020