-
Notifications
You must be signed in to change notification settings - Fork 2
Множество Жюлия
Формула множества Жюлия схожа с формулой множества Мандельброта.
Например, инициализация переменной 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++;
}