Unborn 8.0 Yellow Pointer
본문 바로가기
42 SEOUL/2_frect-ol

[42Seoul/frac'ol] 망델브로 집합(Mandelbrot set), 쥘리아 집합(Julia set), Burning Ship 코드

by 에삐니 2022. 7. 27.
728x90

망델브로 집합(Mandelbrot set)

망델브로 집합은 브누아 망델브로가 고안한 프랙탈의 일종입니다.

수열[Zn]의 절댓값이 무한대로 발산하지 않는 복소수 c의 집합으로 정의됩니다.

$$z_0 = 0 (단, z_n은 복소수)$$

$$z_{n+1} = z_n^2+c$$

이를 복소수를 사용하지 않고 정의하려면 모든 복소수를 실수부와 허수부로 나누면 됩니다. \(z_n\)을 (\(x_ny_n)\)로, c를 (a, b)로 바꾸면 아래와 같은 식을 얻을 수 있습니다.

$$(x_0y_0) = (0,0)$$

$$x_{n+1} = x_n^2 - y_n^2 + a$$

$$y_{n+1} = 2x_ny_n + b (단, x_n, y_n, a, b는 실수)$$

실제로 무한한 항까지 계산하여 발산 여부를 확인하는 것이 어려우므로 어떤 n에 대해 |Zn| > 2일 경우 발산한다는 성질을 이용합니다. 즉, 수열을 계산하다가 절댓값이 2를 넘는 점은 배제하고 그리면 되는 것입니다. 수학적으로는 어떤 점이 망델브로 집합에 포함되거나 포함되지 않거나의 두 가지 경우밖에 없으므로 흑백으로만 그래도 상관은 없지만 대부분의 경우 처음으로 |Zn| > 2를 넘는 경우 배경을 칠합니다.

위 식을 이용하여 망델브로 집합 코드를 작성했습니다. 

void ft_mandelbrot(t_complex c, t_fractol *f)
{
	int 		i;
	t_complex 	z;
	double 		tmpx;

	z.x = c.x;
	z.y = c.y;
	i = 0;
	while (i < ITERATION && (z.x * z.x) + (z.y * z.y) < 4)
        {
		tmpx = (z.x * z.x) - (z.y * z.y);
		z.y = (2 * z.x * z.y) + c.y;
		z.x = tmpx + c.x;
		i++;
	}
}

 

쥘리아 집합 (Julia set)

좌-0.7 -0.27015 / 우 -0.63 -0.386

줄리아 집합의 경우 

$$(x_0y_0) = (0,0)$$

$$x_{n+1} = x_n^2 - y_n^2 + a$$

$$y_{n+1} = 2x_ny_n + b (단, x_n, y_n, a, b는 실수)$$

void	ft_julia(t_complex c, t_fractol *f)
{
	t_complex	z;
	double		tmp;
	int			i;

	i = 0;
	z.x = c.x;
	z.y = c.y;
	while (i < ITERATION && (z.x * z.x) + (z.y * z.y) < 4)
	{
		tmp = z.x;
		z.x = (z.x * z.x) - (z.y * z.y) + f->julia.x;
		z.y = (2 * tmp * z.y) + f->julia.y;
		i++;
	}
	f->i = i;
}

 

불타는 배 프랙탈 (Burning Ship fractal)

$$x_{n+1} = x_n^2 - y_n^2 + a$$

$$y_{n+1} = 2  |x_n y_n| + b (단, x_n, y_n, a, b는 실수)$$

void ft_mandelbrot(t_complex c, t_fractol *f)
{
	int 		i;
	t_complex 	z;
	double 		tmpy;

	z.x = c.x;
	z.y = c.y;
	i = 0;
	while (i < ITERATION && (z.x * z.x) + (z.y * z.y) < 4)
        {
            tmpy = (z.x * z.y);
            z.x = (z.x * z.x) - (z.y * z.y) + c.x;
            z.y = 2 * abs(tmpy) + c.y;
            i++;
	}
}
728x90
반응형

'42 SEOUL > 2_frect-ol' 카테고리의 다른 글

[42Seoul/fract'ol] mlx 함수  (1) 2022.07.27
[42Seoul/fract'ol] 프랙탈(fractal)이란 ?  (0) 2022.07.27
[42Seoul/fract'ol] 프로젝트 소개  (0) 2022.07.26

댓글