2017-12-06 7 views
2

중점 알고리즘으로 채워진 원을 그리려고합니다. 저는 이미 y0 = 320 인 채워지지 않은 원을 그렸습니다. x0 = 240; 반경 = 다음 코드를 가진 - 180 (참조 : https://en.wikipedia.org/wiki/Midpoint_circle_algorithm), 가 enter image description herec-> infinite-loop?에서 중점 알고리즘으로 그려진 원을 채 웁니다.

이제 I 원하는이 잔여 노란색 원 그 :

int x0, int y0, int radius; 

x0 = 320;  //assign values 
y0 = 240; 
radius = 180; 

int x = radius-1; 
int y = 0; 
int dx = 1; 
int dy = 1; 
int err = dx - (radius << 1); 

while (x >= y) 
{ 
    putpixel(x0 + x, y0 + y); 
    putpixel(x0 + y, y0 + x); 
    putpixel(x0 - y, y0 + x); 
    putpixel(x0 - x, y0 + y); 
    putpixel(x0 - x, y0 - y); 
    putpixel(x0 - y, y0 - x); 
    putpixel(x0 + y, y0 - x); 
    putpixel(x0 + x, y0 - y); 

    if (err <= 0) 
    { 
     y++; 
     err += dy; 
     dy += 2; 
    } 
    if (err > 0) 
    { 
     x--; 
     dx += 2; 
     err += dx - (radius << 1); 
    } 
} 

이 (비트 맵에 저장된) 다음과 같은 출력을 제공한다 내가 설정으로이 accommplish 수 있습니다 생각

enter image description here

: 그것은 다음과 같습니다, 그래서 채워집니다 반지름에 매회 반경 - 그래서 그것은 -1 반지름으로 동일한 원을 그린다 - 반지름 = 0까지. 따라서 기본적으로 더 이상 그릴 원 (반지름 = 0)이있을 때까지 새로운 원이 오래된 원으로 채워질 때마다 그려집니다. 내 코드는 다음과 같습니다.

int x0, int y0, int radius;

x0 = 320;  //assign values 
y0 = 240; 
radius = 180; 

int x = radius-1; 
int y = 0; 
int dx = 1; 
int dy = 1; 
int err = dx - (radius << 1); 

while(radius!=0) { 
    while (x >= y) 
    { 
     putpixel(x0 + x, y0 + y); 
     putpixel(x0 + y, y0 + x); 
     putpixel(x0 - y, y0 + x); 
     putpixel(x0 - x, y0 + y); 
     putpixel(x0 - x, y0 - y); 
     putpixel(x0 - y, y0 - x); 
     putpixel(x0 + y, y0 - x); 
     putpixel(x0 + x, y0 - y); 

     if (err <= 0) 
     { 
      y++; 
      err += dy; 
      dy += 2; 
     } 
     if (err > 0) 
     { 
      x--; 
      dx += 2; 
      err += dx - (radius << 1); 
     } 
    } 

    x0 = x0 - 1;  //getting the next circle until radius = 0 
    y0 = y0 -1; 
    radius = radius - 1; 

    x = radius-1; 
    y = 0; 
    dx = 1; 
    dy = 1; 
    err = dx - (radius << 1); 

} 

이 코드는 내가 어떻게 채울 수 있는지 생각해야한다.하지만 내가 얻는 것은 무한 루프이다. 왜 그런 생각이 들까? 아니면 midpoint 알고리즘을 사용하여 원을 채우기위한 다른 방법이 있습니까?

인사말

+2

첫 번째 경우 : 모든 루프에서 x, y, err과 같은 다양한 인덱스의 값을 인쇄하고 멈추는 위치를 관찰하기 위해 많은 printfs를 넣으십시오. 또한 많은 양의 출력을 피하기 위해 작은 원을 사용하십시오. –

+0

@ Jean-FrançoisFabre 그 충고에 감사드립니다. 나는 그것을 시도하고 반지름을 5로 낮 춥니 다. 그러나 어떻게하면 나머지를 채울 수 있을지 생각할 수 있습니다. –

+1

아, 홍수 채우기 알고리즘을 사용할 수도 있습니다. 내가 하나 (파이썬에서 구현) 여기 설명 : https://stackoverflow.com/questions/40963288/fatal-python-error-cannot-recover-from-stack-overflow-during-flood-fill/40963737?s= 2 | 26.2027 # 40963737 –

답변

6

나는 당신의 방법은 아주 좋은 원을 생성하지 않습니다 그 일을 확실 해요; 반올림 오류 등으로 인해 서클에 '구멍'이 생기는 결과가 발생할 수 있습니다 (즉, 채워지지 않은 픽셀).

훨씬 더 나은 접근법은 원이 다양한 길이의 수평선으로 간주 될 수 있다는 것을 깨닫는 것입니다. 따라서 y 구성 요소를 -r에서 r까지 반복하고 각 해당 y은 기존 코드를 사용하여 해당 x을 계산하면됩니다. 그런 다음 (-x, y)에서 (x, y)으로 수평선을 그립니다.

+0

+1 : 나는 이미 그것을 생각했다. 그래서 당신은 선을 한 줄씩 채워야한다는 것을 의미 하는가? 이것은 제가 처음부터 시작 좌표와 끝 좌표를 얻는 것을 의미합니다. 맞습니까? –

+1

예, 원을 여러 개의 수평선으로 그려야 함을 의미합니다. 실제 원 (윤곽선, 채워지지 않음)을 먼저 그릴 필요가 없습니다. 그냥 선을 그으면 충분합니다. 내가 말한 것처럼 원이 대칭이기 때문에 * 수직 좌표 당 하나의 * 수평 좌표 만 계산하면됩니다. – unwind

관련 문제