이 함수는 DDA(Digital Differential Analyzer) 알고리즘을 구현한 것입니다. DDA 알고리즘의 주요 특징들을 잘 반영하고 있습니다:
- 부동소수점 연산 사용: delta_x와 delta_y를 float 타입으로 선언하여 부동소수점 연산을 사용합니다.
- 증분 계산: delta_x /= bigger_delta;와 delta_y /= bigger_delta;를 통해 각 단계별 x와 y의 증분을 계산합니다.
- 선형 보간: 각 단계마다 start.x += delta_x;와 start.y += delta_y;를 통해 좌표를 선형적으로 증가시킵니다.
- 반복 횟수 결정: bigger_delta를 사용하여 더 긴 축을 기준으로 반복 횟수를 결정합니다.
- 픽셀 그리기: 각 단계마다 계산된 좌표에 픽셀을 그립니다.
추가로, 이 구현은 기본 DDA 알고리즘에 몇 가지 개선 사항을 포함하고 있습니다:
- 색상 보간: get_color 함수를 사용하여 선의 시작점과 끝점 사이의 색상을 보간합니다.
- 경계 검사: 화면 경계를 벗어나는 픽셀은 그리지 않도록 검사합니다.
따라서, 이 함수는 DDA 알고리즘의 기본 원리를 따르면서 색상 보간과 경계 검사 기능이 추가된 개선된 버전의 DDA 알고리즘이라고 할 수 있습니다.
그 외 Bresenham의 알고리즘은 컴퓨터 그래픽스에서 선을 그리는 데 사용되는 효율적인 방법입니다. 이 알고리즘은 정수 연산만을 사용하여 빠르고 정확하게 선을 그릴 수 있습니다. Bresenham 알고리즘의 작동 방식을 예시를 통해 상세히 설명해 드리겠습니다.
Bresenham 알고리즘의 기본 원리
Bresenham 알고리즘은 두 점 사이의 선을 그릴 때, 각 x 좌표에 대해 가장 가까운 y 좌표를 선택하는 방식으로 작동합니다. 이 과정에서 결정 변수(decision variable)를 사용하여 다음 픽셀의 위치를 결정합니다.
예시: (1,1)에서 (8,5)까지 선 그리기
이 예시를 통해 Bresenham 알고리즘의 단계별 과정을 살펴보겠습니다.
초기 설정
- 시작점: (x1, y1) = (1, 1)
- 끝점: (x2, y2) = (8, 5)
- dx = x2 - x1 = 8 - 1 = 7
- dy = y2 - y1 = 5 - 1 = 4
- 초기 결정 변수: d = 2dy - dx = 2*4 - 7 = 1
알고리즘 실행
1 | 1 | 1 | 1 | (1, 1) |
2 | 2 | 2 | -1 | (2, 2) |
3 | 3 | 2 | 3 | (3, 2) |
4 | 4 | 3 | 1 | (4, 3) |
5 | 5 | 3 | 5 | (5, 3) |
6 | 6 | 4 | 3 | (6, 4) |
7 | 7 | 4 | 7 | (7, 4) |
8 | 8 | 5 | 5 | (8, 5) |
단계별 설명
- 시작점 (1, 1)에서 시작합니다.
- d > 0이므로 x와 y를 모두 증가시킵니다. 새로운 d = 1 + 2dy - 2dx = 1 + 8 - 14 = -5
- d < 0이므로 x만 증가시킵니다. 새로운 d = -5 + 2dy = -5 + 8 = 3
- d > 0이므로 x와 y를 모두 증가시킵니다. 새로운 d = 3 + 2dy - 2dx = 3 + 8 - 14 = -3
- 이 과정을 끝점에 도달할 때까지 반복합니다.
Bresenham 알고리즘의 장점
- 정수 연산만을 사용하므로 빠른 실행 속도를 제공합니다
- 부동 소수점 연산이 필요 없어 하드웨어 구현에 적합합니다.
- 중복점 생성을 피할 수 있어 효율적입니다.
결론
Bresenham 알고리즘은 간단하면서도 효율적인 선 그리기 방법을 제공합니다. 이 알고리즘은 컴퓨터 그래픽스에서 널리 사용되며, 특히 하드웨어 제약이 있는 환경에서 유용합니다. 위의 예시에서 볼 수 있듯이, 알고리즘은 각 단계에서 간단한 결정을 통해 최적의 픽셀 위치를 선택하여 부드러운 선을 그릴 수 있습니다.
또다른 전개
기본 정보
시작점: (1,1)
끝점: (8,5)
Δx = 8 - 1 = 7
Δy = 5 - 1 = 4
알고리즘 단계
결정 변수 초기화:
D = 2 * Δy - Δx
D = 2 * 4 - 7 = 1
각 x 좌표에 대해 반복:
D > 0이면 y를 증가시키고 D에서 2*Δx를 뺍니다.
D <= 0이면 y를 그대로 두고 D에 2*Δy를 더합니다.
실제 그리기 과정
text
(1,1) 시작점, D = 1
(2,1) D = 1 + 2*4 = 9
(3,2) D = 9 - 2*7 = -5
(4,2) D = -5 + 2*4 = 3
(5,3) D = 3 - 2*7 = -11
(6,3) D = -11 + 2*4 = -3
(7,4) D = -3 - 2*7 = -17
(8,5) 끝점
시각화
text
y
5 *
4 *
3 * *
2 * *
1 * *
1 2 3 4 5 6 7 8 x
설명
(1,1)에서 시작합니다. 초기 D = 1입니다.
x를 1 증가시켜 (2,1)로 이동합니다. D > 0이므로 y를 증가시키지 않습니다.
D가 9가 되어 0보다 크므로, 다음 점은 (3,2)입니다. D를 갱신합니다.
이 과정을 반복하여 최종적으로 (8,5)에 도달합니다.
이 방법으로 Bresenham 알고리즘은 부동소수점 연산 없이 정수 연산만으로 가장 근접한 픽셀을 선택하여 (1,1)에서 (8,5)까지의 직선을 그립니다. 각 단계에서 x는 항상 1씩 증가하고, y는 결정 변수 D에 따라 증가하거나 그대로 유지됩니다.
'C Language' 카테고리의 다른 글
리눅스에서 마스크 0 의 의미 (0) | 2025.01.25 |
---|---|
isometric vs perspective (0) | 2025.01.24 |
3D draw 함수 설명 (0) | 2025.01.24 |
이미지 버퍼 초기화 함수 (0) | 2025.01.24 |
MiniLibx 기본 구현 알고리즘 (0) | 2025.01.24 |