midpoint circle algorithm은 반지름이 정수인 경우 원을 계산하는 데 적합합니다.부동 소수점 반경을 가진 원을 계산하는 데 사용되는 알고리즘은 무엇입니까?
..... .XXX.
..X.. X...X
.X.X. X...X
..X.. X...X
..... .XXX.
r=1 r=2
하지만, I는 r=1
및 r=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.33
및 r=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)에만 관심이 있다면
그래서 왜 보이지 않는 코드 버전이 작동하지 않는지 묻고 있습니까? 여기에 어떤 문제가 있습니까? ;-) – hyde
어쨌든이 전체 알고리즘은 정수 연산을 기반으로합니다. 스케일링에 정수를 사용하거나 원 *에 기본 * sin * 및 * cos * 공식을 사용하십시오. – hyde
@hyde'int'를'float'로 대체 한 코드 블록을 복사하고 붙여 넣기 한 다음 'round'가 추가 된 다른 복사본과 붙여 넣기가 너무 어렵습니다. –