42 fract_ol

seungcoh·2021년 9월 3일
1

42

목록 보기
2/2
post-thumbnail

1. 구현해야 하는것

  • mlx 라이브러리를 이용하여 Julia set과 Mandelbrot set fractol을 그리기
  • 마우스 휠을 통한 zoom in, out 구현
  • 적절한 색깔 입히기
  • parameter를 이용해서 각각의 fractol을 실행시키고 잘못된 parameter에 대한 error message 출력
  • esc key를 눌렀을때 프로그램이 종료되게하기
  • mlx의 image로 구현하기

2. fractol에 관한 지식

  • 복소좌표

소수 z를 실수부와 허수부로 나누어 좌표화한 것

  • Mandelbrot set

복소좌표의 모든 좌표 c = (a,b)에 대해서 z0 = (x0,y0) = (0,0)을 초기값으로 하여 다음 수식이 발산하지 않는 좌표들을 모은 것으로 위와 같은 그림이 그려지게 된다.

zn+1=zn2+c\displaystyle z_{n+1} = z_{n}^{2} + c
xn+1=xn2yn2+a\displaystyle x_{n+1} = x_{n}^{2} - y_{n}^{2} + a
yn+1=2xnyn+b\displaystyle y_{n+1} = 2x_{n}y_{n} + b
  • Julia set

임의의 복소수 c = (a,b)에 대해서 복소좌표의 모든 좌표 z0 = (x0,y0)가 Mandelbrot의 수식에서 발산하지 않는 좌표들을 모은 것이다. Mandelbrot과 비교해보면 그려야하는 복소좌표가 z항인지 c항인지에 따라 달라진다고 할 수 있다. 또한 두 fractol은 모두 원점을 중심으로 하는 반지름 2인 원 안에 그려진다.

3. fractol 그리기

  • 복소 좌표에서 그려야 할 공간은 -2<=x<=2, -2<=y<=2의 범위를 가지며 mlx윈도우의 크기를 800*800이라고 가정했을때 위 그림과 같이 표현 할 수 있다. 즉 가로 800개의 pixel로 좌표상의 -2<=x<=2를 그려내면 된다.
  • 따라서 1pixel은 좌표상에서 4/800=1/200의 길이를 나타내게 된다.
  • 또한 위 그림을 보면 image 상에서 (0,0)은 왼쪽 맨 위점임을 알 수 있다. image의 중앙이 (0,0)을 의미하도록 만들기 위해서 각 점마다 가로길이의 절반을 x에, 세로길이의 절반을 y에서 빼주어야한다.
  • 이 과정을 쉽게 표현하면 image 상의 (0,1)이 복소좌표의 (0, 1/200)과 같게 만들어주는 작업이다.
  • 복소 좌표계의 y값이 아래로 갈때 증가함에 주의 해야한다.

4. zoom in and out

  • 연산을 쉽게 하기 위해서 3번에서 그려내고 있는 복소 좌표계에서의 범위 -2<=x<=2, -2<=y<=2(가로길이, 세로길이, center 좌표) = (4,4,(0,0))의 세가지 정보로 저장한다.

  • 위 그림은 1.5배 확대과정과 축소과정을 그려내고 있는 window의 범위를 변화시킨 후 변화 된 범위를 pixel로 그렸을때 어떻게 그려지는지 보여주고 있다.
  • 확대를 예로 들면 (가로길이, 세로길이, center) -> (가로길이/1.5, 세로길이/1.5, center)로 변화가 발생한다.

  • 좀 더 일반화하여 지금 그려내고 있는 image의 범위를 (L, W, (0,0))으로 현재 마우스 포인터의 위치는 (m.x, m.y)로 zoom in, out할 비율을 zoom_rate로 지정하여 zoom out과정(축소)를 보여주고 있다.
  • 현재 center점으로 부터 확대된 image의 center점을 구하는 과정이며 (L, W, (0,0)) -> (L*zoom_rate, W*zoom_rate, (-m.x*zoom_rate, ?))으로 변환한다고 생각하면 된다.
  • new center의 y좌표도 마찬가지 방법으로 유도하면 되므로 생략한다.
  • 위 그림은 현재 image의 center가 (0,0)이라고 가정하고 있다. 만약 현재 center를 center(c.x, c.y)라고 가정하면 new_center(c.x - m.x*zoom_rate, c.y - m.y*zoom_rate)가 된다.
  • zoom out과정또한 같은 방법으로 유도하면
    new_center(m.x*(1 - 1/zoom_rate), m.y*(1 - 1/zoom_rate)) 가 된다.

5. result

  • Mandelbrot

  • Mandelbrot zoom in

  • Julia -0.7 -0.27015

  • Julia -0.7 -0.27015 zoom in

0개의 댓글