42 Seoul

[42Seoul/Fractol] 다시 시작 mlx

jaewpark 2022. 3. 7. 14:54

22월 3월 7일, 오늘기준 딱 15일 남은 기간, 다시 시작 !! 

그 전에 해놓았던 코드는 9개월 전에 했던 것이고 일단 어떤 것을 필수적으로 만들어야 하고 지켜야 하는 것은 무엇인지 체크 하고자 한다. (다 까먹었다.. 그때 코로나였어도 마무리를 해버릴걸 ㅠㅠ)

전역 변수 사용 금지
C로 코딩
오류의 처리
메모리 누수 금지
miniLIbX를 사용

Julia와 Mandelbrot 를 제공
마우스 휠로 무한대로 확대 및 축소되는 기능 구현
프랙탈 깊이를 최소한 몇 가지의 색상을 사용
매개변수를 사용 시, 더 많이 사용하거나 무시하도록

 


MiniLibX

42Seoul에서 제공된 라이브러리로 이미지 작업을 위한 툴

컴파일을 위해 Makefile에 다음과 같은 규칙을 추가 (프로젝트 루트에 mlx 이름이 지정된 폴더에 소스가 있다는 가정)

%.o: %.c
	$(CC) -Wall -Wextra -Werror -Imlx -c $< -o $@

 

mlx 함수

mlx_init() = 그래픽 시스템에 대한 연결 설정으로 MiniLibX를 초기화
mlx_new_window() = mlx, width, height, 창 이름 4개의 변수를 들어가야 하며, 새로운 창을 만드는 기초

 

mlx_new_image()  = 창 내에서 그림 그리기 전 도화지 크기 설정
mlx_get_data_addr() = bits_per_pixel, line_length, endian 이미지 주소가 있지만 픽셀이 없고 정리되지 않았기에 설정된 라인 길이를 사용하여 메모리 오프셋을 계산

 

mlx_loop() = loop를 돌면서 event를 기다리고 생성한 윈도우를 랜더링
mlx_hook() = 이벤트나 메세지를 처리하는 코드 (자세한 건 이전 발행글 참조)

 

그럼 이렇게 대략적인 조작 및 창 띄우는 것까지 했으니, 조작에 따라서 그래픽이 적용될 수 있게 하는 방법을 알아보자

 


 

Julia & Mandelbrot

Fractal(일부 작은 조각이 전체와 비슷한 기하학적 형태)의 종류 중 하나로, 

Julia : 정의된 수열이 발산하지 않는 성질을 갖도록 하는 복소수 z의 집합

Mandelbrot : 정의된 수열이 발산하지 않는 성질을 갖도록 하는 복소수 c의 집합으로 정의

정의된 점화식

 

이러한 좌표로 이루어진 형태를 그리게 되면 위키피디아에서 시각적으로 볼 수 있다.

위와 같이 mlx 조작법을 이용해서 그리기 위해서는 좌표를 -2 ~ 2 을 기준 (위키피디아에서 보면 좌표가 X축에서 -2 ~ 1 이기에 개인적으로 판단) 창 너비를 1000pixel 고정 시켰다.

실수인 부분을 조건으로 충족이 된다면 좌표에 그릴 수 있도록 조건문을 하고 그러한 것을 픽셀 단위로 반복을 하면서 그림을 그리면 된다.

 

menu control

키 조작으로 프랙탈로 넘어 갈 수 있게하는 기능 : 변수 하나로 키를 움직일 때마다 변경
화면 : 키가 변경될 때마다, 화면 이미지를 재출력
사용 함수 : mlx_loop_hook, mlx_hook, mlx_xpm_file_to_image, mlx_put_image_to_window 등

 

 

julia : 주어진 복소수 c에 대해서 다음 점화식에 따라 정의된 수열이 발산하지 않는 성질을 갖도록 하는 복소수 z의 집합
z=0+0i일 때 z를 발산하지 않게 하는 c의 집합
기능 : 마우스 움직임에 따라 해당 프렉탈의 모양이 변하게끔 변화
사용함수 : mlx_hook, mlx_put_image_to_window 등

 

mandelbrot : 정의된 수열이 발산하지 않는 성질을 갖도록 하는 복소수 c의 집합으로 정의
사용함수 : mlx_ hook, mlx_put_image_to_window 등

 

1. 점화식의 좌표 x, y축을 나타내는 부분에서 a, b가 변화함에 따라서 julia의 모양이 변화를 할 수 있어야 하는데, 복수평면에 그려지는 부분을 마우스 위치에 따라 a, b부분을 컨트롤 하는 함수가 필요

 

2. 기본적으로 만델브로는 x 축이 3,  y 축이 2 로 구성 되어 있기에 이 부분을 그리는데, 있어서 정사각형 x 축 4, y 축 4 로 생각을 하고 그림을 그려간다. 코드에서 픽셀차이를 그냥 w로 나눠주기 위해 ratio 는 4로 놓은 상황이다.

 


그리고 한 번의 평가에서 실패! 서브젝트에는 적혀있는 한 줄, 프로그램의 x버튼을 눌렀을 때, 깔끔하게 프로그램이 종료 되어야 한다는 문구가 있다. 그 부분은 mlx_hook 부분에서 해결할 수 있는 방법이 있었고,

마우스 컨트롤 하는 과정에서 조건문을 제대로 하지 않았기에 프로그램의 상단에 title 이 아닌 부분을 눌러서 창 이동을 하려고 하면 segfault가 발생하였는데 이 부분은 해결을 하고자 핸들링 하는 함수를 해당 플랙탈로 진입 시 발동하도록 조치를 취하니 해결이 되었다.

 

42 mlx docs : https://harm-smits.github.io/42docs/libs/minilibx/getting_started.html