우리의 컴퓨터 화면은 매트릭스 형태로 조직된 픽셀로 구성되어 있기 때문에 연속적인 부드러운 호를 컴퓨터 화면에 표시하는 것은 쉽지 않습니다. 따라서 컴퓨터 화면에 원을 그리려면 항상 인쇄된 픽셀에서 가장 가까운 픽셀을 선택하여 호를 형성해야 합니다. 이를 수행하는 두 가지 알고리즘이 있습니다.
- 중간점 원 그리기 알고리즘
- Bresenham의 원 그리기 알고리즘
우리는 이미 다음 사항에 대해 논의했습니다. 중간점 원 그리기 알고리즘 이전 게시물에서. 이번 게시물에서는 Bresenham의 원 그리기 알고리즘에 대해 논의하겠습니다.
자바의 최종 키워드
이 두 알고리즘은 모두 대칭성이 높다는 원의 주요 기능을 사용합니다. 따라서 전체 360도 원에 대해 45도 각 8분원을 8부분으로 나눕니다. 이를 위해 Bresenham의 원 알고리즘을 사용하여 45도의 첫 번째 8분원에 있는 픽셀 위치를 계산합니다. 원의 중심이 원점에 있다고 가정합니다. 따라서 모든 픽셀(xy)에 대해 아래와 같이 원의 8개 옥탄트 각각에 픽셀을 그리는 것으로 계산됩니다.
픽셀(xy)의 경우 8옥탄트의 가능한 모든 픽셀
이제 이전에 알려진 픽셀 위치(xy)에서 다음 픽셀 위치를 계산하는 방법을 살펴보겠습니다. 임의의 지점(x y)에서 Bresenham의 알고리즘에는 동쪽(즉, (x+1 y))에서 다음 픽셀을 선택하거나 남동쪽(즉, (x+1 y-1))에서 다음 픽셀을 선택하는 두 가지 옵션이 있습니다.
그리고 이는 다음과 같이 결정 매개변수 d를 사용하여 결정할 수 있습니다.
- d > 0이면 (x+1 y-1)이 호에 더 가까워지므로 다음 픽셀로 선택됩니다.
- else (x+1 y)가 다음 픽셀로 선택됩니다.
이제 주어진 반경 'r'과 중심(xc yc)에 대한 원을 그리려면 (0 r)에서 시작하여 첫 번째 사분면에서 x=y(예: 45도)까지 이동합니다. 나열된 초기 조건부터 시작해야 합니다.
d = 3 - (2 * r)
x = 0
y = r
이제 각 픽셀에 대해 다음 작업을 수행합니다.
- (xc yc)와 (x y)의 초기값을 설정합니다.
- 결정 매개변수 d를 d = 3 – (2 * r)로 설정합니다.
- drawCircle(int xc int yc int x int y) 함수를 호출합니다.
- x가 될 때까지 다음 단계를 반복합니다.<= y:
- 만약 d< 0 set d = d + (4 * x) + 6.
- 그렇지 않으면 d = d + 4 * (x – y) + 10으로 설정하고 y를 1씩 감소시킵니다.
- x 값을 증가시킵니다.
- drawCircle(int xc int yc int x int y) 함수를 호출합니다.
drawCircle() 함수:
C# 날짜 시간CPP
// function to draw all other 7 pixels // present at symmetric position drawCircle(int xc int yc int x int y) { putpixel(xc+x yc+y RED); putpixel(xc-x yc+y RED); putpixel(xc+x yc-y RED); putpixel(xc-x yc-y RED); putpixel(xc+y yc+x RED); putpixel(xc-y yc+x RED); putpixel(xc+y yc-x RED); putpixel(xc-y yc-x RED); }
다음은 위 접근 방식의 C 구현입니다.
CPP// C-program for circle drawing // using Bresenham’s Algorithm // in computer-graphics #include #include #include // Function to put pixels // at subsequence points void drawCircle(int xc int yc int x int y){ putpixel(xc+x yc+y RED); putpixel(xc-x yc+y RED); putpixel(xc+x yc-y RED); putpixel(xc-x yc-y RED); putpixel(xc+y yc+x RED); putpixel(xc-y yc+x RED); putpixel(xc+y yc-x RED); putpixel(xc-y yc-x RED); } // Function for circle-generation // using Bresenham's algorithm void circleBres(int xc int yc int r){ int x = 0 y = r; int d = 3 - 2 * r; drawCircle(xc yc x y); while (y >= x){ // check for decision parameter // and correspondingly // update d y if (d > 0) { y--; d = d + 4 * (x - y) + 10; } else d = d + 4 * x + 6; // Increment x after updating decision parameter x++; // Draw the circle using the new coordinates drawCircle(xc yc x y); delay(50); } } int main() { int xc = 50 yc = 50 r = 30; int gd = DETECT gm; initgraph(&gd &gm ''); // initialize graph circleBres(xc yc r); // function call return 0; }
산출:

장점
- 간단한 알고리즘입니다.
- 쉽게 구현 가능해요
- 이는 전적으로 원 방정식, 즉 x를 기반으로 합니다.2+y2=r2
단점
- 포인트 생성 시 정확성에 문제가 있습니다.
- 이 알고리즘은 복잡하고 높은 그래픽 이미지에는 적합하지 않습니다.