|
그 유명한(?) Bresenham's 알고리즘입니다.
void put_pixel(int xx,int yy,int x,int y)
{
Form1->Canvas->Pixels[xx+x][yy+y]=clBlack;
Form1->Canvas->Pixels[xx-x][yy+y]=clBlack;
Form1->Canvas->Pixels[xx-x][yy-y]=clBlack;
Form1->Canvas->Pixels[xx+x][yy-y]=clBlack;
}
void put_line(int xx,int yy,int x,int y)
{
Form1->Canvas->MoveTo(xx+x,yy+y);
Form1->Canvas->LineTo(xx-x,yy+y);
Form1->Canvas->MoveTo(xx+x,yy-y);
Form1->Canvas->LineTo(xx-x,yy-y);
}
void ellipse(int x1,int y1,int x2,int y2,int mode) //mode..fill
{
void(*put)(int,int,int,int);
switch(mode){
case 0:put=put_pixel;break;
case 1:put=put_line;break;
}
int x,y,a2,b2,S,T;
int a=(x2-x1)/2;
int b=(y2-y1)/2;
a2=a*a;
b2=b*b;
x=0;
y=b;
S=a2*(1-2*b)+2*b2;
T=b2-2*a2*(2*b-1);
put(x1+a,y1+b,x,y);
do{
if(S<0){
S+=2*b2*(2*x+3);
T+=4*b2*(x+1);
x++;
}else if(T<0){
S+=2*b2*(2*x+3)-4*a2*(y-1);
T+=4*b2*(x+1)-2*a2*(2*y-3);
x++;
y--;
}else{
S-=4*a2*(y-1);
T-=2*a2*(2*y-3);
y--;
}
put(x1+a,y1+b,x,y);
}while(y>0);
}
김인구.구야 님이 쓰신 글 :
: 언뜻 생각같아선 Ellipse도 내부적으로
: SetPixel로 그렸을꺼 같은데 약간의 문제가 있을거 같기도 하구요...
: SetPixel이나 LineTo 둘중 하나로 구현 해볼려고 합니다.
: 도움 부탁드립니다.
|