Skip to content

Множество Жюлия

VBrazhnik edited this page Aug 3, 2019 · 1 revision

Формула множества Жюлия схожа с формулой множества Мандельброта.

Например, инициализация переменной z в формулах этих двух множеств идентична:

Инициализация формулы множества Мандельброта

Отличие между ними заключается в основной части формул, где в случае множества Жюлия используется константа k, вместо переменной c в множестве Мандельброта:

Формула множества Жюлия

Согласно тексту задания значение константы k в нашей программе должно устанавливаться с помощью мышки.

Кроме уже описанных в разборе множества Мандельброта переменных, для множества Жюлия необходимо также инициализировать упомянутую константу:

k = init_complex(-0.4, 0.6);

Чтобы иметь возможность устанавливать значение k с помощью мышки, мы будем использовать следующую функцию:

int julia_motion(int x, int y, t_fractol *fractol)
{
    fractol->k = init_complex(
        4 * ((double)x / WIDTH - 0.5),
        4 * ((double)(HEIGHT - y) / HEIGHT - 0.5));
    draw_fractal(fractol);
    return (0);
}

Принцип ее работы может быть неочевидным, поэтому подробнее рассмотрим некоторые ключевые моменты.

Если бы мы устанавливали k с помощью следующих строк кода, то значения действительной и мнимой части варьировались бы в пределах [0; 1] при перемещении курсора мышки в границах окна программы:

fractol->k = init_complex(
    (double)x / WIDTH,
    (double)(HEIGHT - y) / HEIGHT);

Значение мнимой части устанавливается особым образом потому, что в программе ось y направлена сверху вниз, а не снизу вверх. И с помощью такого подхода мы переворачиваем данную ось в привычное положение.

Если использовать приведенный выше код, то условная «точка равновесия» будет совпадать с точкой начала координат и находиться в левом нижнем углу.

Чтобы разместить ее по центру окна программы, необходимо сместить оси координат на 0.5 ниже и левее:

fractol->k = init_complex(
    (double)x / WIDTH - 0.5,
    (double)(HEIGHT - y) / HEIGHT - 0.5);

Теперь возможные значения действительной и мнимой части лежат в диапазоне [-0.5; 0.5] при перемещении мышки в пределах окна.

Умножение на 4 лишь увеличивает диапазон возможных значений.

В коде формула множества Жюлия будет выглядеть так:

iteration = 0;
while (pow(z.re, 2.0) + pow(z.im, 2.0) <= 4
    && iteration < max_iteration)
{
    z = init_complex(
        pow(z.re, 2.0) - pow(z.im, 2.0) + fractol->k.re,
        2.0 * z.re * z.im + fractol->k.im);
    iteration++;
}