2014-01-06 3 views
0

midpoint circle algorithm은 반지름이 정수인 경우 원을 계산하는 데 적합합니다.부동 소수점 반경을 가진 원을 계산하는 데 사용되는 알고리즘은 무엇입니까?

..... .XXX. 
..X.. X...X 
.X.X. X...X 
..X.. X...X 
..... .XXX. 
r=1 r=2 

하지만, I는 r=1r=2 사이 몇 단계를 필요 각각 다음과 같은 예를 들어

void CircleOptimized(int xc, int yc, int r, int color) { 
    unsigned int x= r, y= 0;//local coords  
    int   cd2= 0; //current distance squared - radius squared 
    if (!r) return; 
    drawpixel(xc-r, yc, color); 
    drawpixel(xc+r, yc, color); 
    drawpixel(xc, yc-r, color); 
    drawpixel(xc, yc+r, color); 
    while (x > y) { //only formulate 1/8 of circle 
     cd2-= (--x) - (++y); 
     if (cd2 < 0) cd2+=x++; 
     drawpixel(xc-x, yc-y, color);//upper left left 
     drawpixel(xc-y, yc-x, color);//upper upper left 
     drawpixel(xc+y, yc-x, color);//upper upper right 
     drawpixel(xc+x, yc-y, color);//upper right right 
     drawpixel(xc-x, yc+y, color);//lower left left 
     drawpixel(xc-y, yc+x, color);//lower lower left 
     drawpixel(xc+y, yc+x, color);//lower lower right 
     drawpixel(xc+x, yc+y, color);//lower right right 
    } 
} 

, r=1를 통과 r=2 출력이다. 아마도 (가설) r=1.33r=1.66 다음과 같을 수있는 :

..... ..... ..X.. .XXX. 
..X.. .XXX. .X.X. X...X 
.X.X. .X.X. X...X X...X 
..X.. .XXX. .X.X. X...X 
..... ..... ..X.. .XXX. 
r=1.0 r=1.3 r=1.6 r=2.0 

을하지만, 내가 (또는 반올림하지 않고)는 부동 소수점 연산을 사용하는 위의 알고리즘을 적용 할 때, 그것의 대칭을 잃고 불연속 경로를 생성 (결과적으로 매우 이상한 모양).

내 용도로 적합한 알고리즘이 있습니까? 당신은 간단한 분수 (같은 4/3 및 5/3)에만 관심이 있다면

+2

그래서 왜 보이지 않는 코드 버전이 작동하지 않는지 묻고 있습니까? 여기에 어떤 문제가 있습니까? ;-) – hyde

+0

어쨌든이 전체 알고리즘은 정수 연산을 기반으로합니다. 스케일링에 정수를 사용하거나 원 *에 기본 * sin * 및 * cos * 공식을 사용하십시오. – hyde

+0

@hyde'int'를'float'로 대체 한 코드 블록을 복사하고 붙여 넣기 한 다음 'round'가 추가 된 다른 복사본과 붙여 넣기가 너무 어렵습니다. –

답변

2

, 나는 (즉, 사용 여기에 서브 픽셀, 9 개 서브 픽셀을 오버 샘플링 것 따라서 반경 4 및 5 서브 픽셀을 갖는 원을 계산하고 그 다음 서브 픽셀에서 좋은 값의 픽셀을 추론합니다. ON이 아닌 다른 것으로 추론하면 OFF로 앤티 앨리어싱을 수행합니다.

0

기본 원 그리기 ...

public void DrawCircle(float stepSize, float radius, int colour) 
{ 
    float x, y; 
    float angle; 

    while (angle < 2*Math.PI) 
    { 
     x = radius * cos(angle); 
     y = radius * sin(angle); 
     // decide how to round your floating point X,Y here ... 
     drawpixel(x,y,colour); 
     angle += stepSize; 
    } 
} 
+1

'단계'와 '결정 방법'을 찾는 것이 가장 큰 두 가지 문제입니다. 그것들을 해결하는 것은 중점 원형 알고리즘 인 methink를 적용하는 것보다 더 문제가 될 수 있습니다. – Sinatr

+0

글쎄, '단계'는 서클을 얼마나 원할하게 할 것인가입니다. 서클 크기에 대해 너무 많은 단계가 걱정된다면 반경을 기준으로 한 단계 조정을 제안 할 수 있습니다. '둥근 방법 결정하기'가 일관성있는 한 (예 : 항상 반 내림) 중간 점 원 알고리즘으로 연결되지 않은 세그먼트로 끝나지 않게됩니다. – Mashton

+0

너무 작은 단계를 취하거나 가장 가까운 픽셀에 대한 결정을 고려하지 않은 경우 한 번에 2 개의 원을 그릴 수 있습니다. 분수를 제거하고 반올림하여 (예 : 1.3의 경우 1로, 2).적절한 단계와 반올림 결정을 찾는 것이 어렵습니다. 그 작은 원을 직접 그린다. 나는 당신의 대답이 틀렸다는 것을 말하는 것이 아닙니다, 그것은 맞습니다, 그러나 너무 일반적이어서 어쩌면 주어진 질문에 잘 맞지 않을 것입니다 ^^ – Sinatr

0

난 테일러 근사

  • 첫번째 순서 테일러 근사를 사용하여 X^2 = R^2 Y^2의 X를 계산 유용 할 수 있다고 생각한다 (SQRT (U^2 + a) = U + a/2u)
관련 문제