You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// Bresenham's Line Algorithm 구현voiddraw_line(t_fdf*fdf, t_pointstart, t_pointend)
{
intdx=abs(end.x-start.x);
intdy=abs(end.y-start.y);
intsx=start.x<end.x ? 1 : -1; // x 방향 결정intsy=start.y<end.y ? 1 : -1; // y 방향 결정interr= (dx>dy ? dx : -dy) / 2; // 초기 오차 값while (1)
{
my_mlx_pixel_put(fdf, start.x, start.y, start.color);
if (start.x==end.x&&start.y==end.y)
break;
inte2=err;
if (e2>-dx) { err-=dy; start.x+=sx; } // x 좌표 업데이트if (e2<dy) { err+=dx; start.y+=sy; } // y 좌표 업데이트
}
}
2. Isometric Projection
// 등각 투영 변환 함수voidiso(int*x, int*y, intz)
{
intprevious_x=*x;
intprevious_y=*y;
// 30도 회전 (cos(30) ≈ 0.866, sin(30) ≈ 0.5)*x= (previous_x-previous_y) *cos(0.523599); // 0.523599 rad = 30도*y=-z+ (previous_x+previous_y) *sin(0.523599);
}
🔍 트러블슈팅
1. 에러 처리 시스템
// 에러 타입 정의typedefenume_error
{
E_ARGS, // 인자 개수 오류E_FILE, // 파일 오류E_MALLOC, // 메모리 할당 오류E_MAP, // 맵 형식 오류E_MLX// MLX 관련 오류
} t_error;
// 통합 에러 처리 함수voidhandle_error(t_errorerror, t_fdf*fdf)
{
ft_putstr_fd("Error: ", 2);
if (error==E_ARGS)
ft_putstr_fd("Invalid number of arguments\n", 2);
elseif (error==E_FILE)
ft_putstr_fd("Cannot open file\n", 2);
elseif (error==E_MALLOC)
ft_putstr_fd("Memory allocation failed\n", 2);
elseif (error==E_MAP)
ft_putstr_fd("Invalid map format\n", 2);
elseif (error==E_MLX)
ft_putstr_fd("MLX error occurred\n", 2);
cleanup_fdf(fdf);
exit(1);
}
2. 메모리 관리
// 메모리 누수 방지를 위한 정리 함수voidcleanup_fdf(t_fdf*fdf)
{
if (!fdf)
return;
if (fdf->img)
mlx_destroy_image(fdf->mlx, fdf->img);
if (fdf->win)
mlx_destroy_window(fdf->mlx, fdf->win);
if (fdf->mlx)
{
mlx_destroy_display(fdf->mlx);
free(fdf->mlx);
}
free_map(fdf->map);
free(fdf);
}
3. 성능 최적화
// 이미지 버퍼 직접 조작voidmy_mlx_pixel_put(t_fdf*fdf, intx, inty, intcolor)
{
char*dst;
if (x >= 0&&x<WIDTH&&y >= 0&&y<HEIGHT)
{
dst=fdf->addr+ (y*fdf->line_length+x* (fdf->bits_per_pixel / 8));
*(unsigned int*)dst=color;
}
}
// 더블 버퍼링voidrender_frame(t_fdf*fdf)
{
draw_to_image(fdf);
mlx_put_image_to_window(fdf->mlx, fdf->win, fdf->img, 0, 0);
}
// 최적화 전/후 성능 비교voidperformance_comparison(void)
{
// 1. 픽셀 그리기 최적화// Before: mlx_pixel_put() - 약 100ms/1000픽셀mlx_pixel_put(mlx, win, x, y, color);
// After: 직접 메모리 접근 - 약 1ms/1000픽셀char*dst;
dst=data->addr+ (y*data->line_length+x* (data->bits_per_pixel / 8));
*(unsigned int*)dst=color;
// 2. 뷰포트 컬링 최적화// Before: 모든 점 처리 - O(n²)for (allpoints)
draw_point();
// After: 화면 내 점만 처리 - O(visible_points)if (is_in_viewport(point))
draw_point();
}
test_maps/42.fdf # 기본 테스트 맵
test_maps/pyra.fdf # 피라미드 형태
test_maps/elem.fdf # 기초 요소 테스트
test_maps/10-2.fdf # 10x10 간단한 맵
test_maps/20-60.fdf # 20x20 복잡한 맵
test_maps/50-4.fdf # 50x50 중간 크기
test_maps/100-6.fdf # 100x100 큰 맵
test_maps/basictest.fdf # 기본 기능 테스트
test_maps/elem-col.fdf # 컬러 테스트
test_maps/elem-fract.fdf # 소수점 테스트
test_maps/pentenegpos.fdf # 양수/음수 혼합
test_maps/plat.fdf # 평면 테스트
42 맵 기본 입력
42 맵 기본 출력
3D 뷰 조작
최종 결과물
✅ 체크리스트
1. 필수 구현사항
맵 파일 파싱
와이어프레임 그리기
투영 변환
기본 에러 처리
메모리 누수 없음
2. 보너스 구현사항
마우스 컨트롤
추가 투영법
색상 그라데이션
회전/이동/확대축소
3. 최적화 검증
더블 버퍼링 구현
이미지 버퍼 직접 조작
뷰포트 컬링 적용
성능 테스트 통과
🏆 평가 준비
메모리 누수 체크
valgrind --leak-check=full ./fdf maps/42.fdf
Norminette 검사
norminette *.c *.h
에러 케이스 테스트
./fdf # 인자 없음
./fdf invalid.fdf # 잘못된 파일
./fdf maps/empty.fdf # 빈 파일