www.pudn.com > cwin.rar > ARC.C
/*-----------------------------------------------------------
函数 _DrawArc : 画弧
-----------------------------------------------------------*/
#include
#include
#include
void _Cdecl _DrawArc(col,row,a,b,t1,t2,color,fill)
int col; /* 圆心列坐标(以象素为单位) */
int row; /* 圆心行坐标(以象素为单位) */
int a; /* 椭圆横半径(以象素为单位) */
int b; /* 椭圆纵半径(以象素为单位) */
int t1; /* 弧起始角度(以度为单位) */
int t2; /* 弧终止角度(以度为单位) */
int color; /* 弧颜色 */
int fill; /* 填充模式 */
{
int dx,dy,f,fx,fy,x,y,j,mx,my,x1,y1,lx,ly,r,j1;
double t;
/*-- 计算弧起始点的坐标 ---------------*/
t = (double)t1*M_PI/180.0;
r = max(a,b);
x1 = (double)r*cos(t)+0.5;
y1 = (double)r*sin(t)+0.5;
t = (double)(t2-t1);
while(fabs(t)>360.0)
t += t>0?-360.0:360.0;
if(x1==0 && y1 == 0)
return;
if(fabs(t)+1.0 == 1.0)
t = 360.0;
if(t>0.0)
{
dx = (y1>0 || y1==0 && x1>0)?-1:1;
dy = (x1<0 || x1==0 && y1>0)?-1:1;
}
else
{
dx = (y1<0 || y1==0 && x1>0)?-1:1;
dy = (x1>0 || x1==0 && y1>0)?-1:1;
}
lx = 0;
ly = 0;
j1 = 0;
t2 = t1;
while(t2>=90)
{
j1 += 2*r;
t2 -= 90;
}
x = r*cos((double)t2*M_PI/180.0);
y = r*sin((double)t2*M_PI/180.0);
j1 += y+(r-x);
j = 0;
t2 = t;
t += t1;
if(t2>0)
{
while(t>=90.0)
{
j += 2*r;
t -= 90.0;
}
x = r*cos(t*M_PI/180.0)+0.5;
y = r*sin(t*M_PI/180.0)+0.5;
j += y+(r-x);
j -= j1;
}
else
{
if(t>0.0)
t2 = 1;
else
{
t2 = 0;
t = -t;
}
while(t>=90.0)
{
j += 2*r;
t -= 90.0;
}
x = r*cos(t*M_PI/180.0)+0.5;
y = r*sin(t*M_PI/180.0)+0.5;
j += y+(r-x);
if(t2 == 1)
j = j1-j;
else
j = j+j1;
}
j -= 1;
f = 0;
fx = 2*x1*dx+1;
fy = 2*y1*dy+1;
mx = 0;
my = 0;
t = (double)t1*M_PI/180.0;
x = (int)((double)a*cos(t)+0.5);
y = (int)((double)b*sin(t)+0.5);
/*-- 如果是实心扇形则画一半径 ---------*/
if(fill)
draw_line(col+x,row-y,col,row,color);
/*-- 如果是弧则画起始点 ---------------*/
else
_PutPixel(col+x,row-y,color);
/*-- 画弧 -----------------------------*/
while(j!=0)
{
if(f>=0)
{
lx += a;
if(lx>=r)
{
/*-- 如果是实心扇形则填充 -*/
if(fill==2)
{
x += dx;
lx -= r;
draw_line(col+x,row-y,col,row,color);
}
/*-- 画弧上的点 -----------*/
else
{
if(mx!=0)
{
_PutPixel(col+x,row-y,color);
mx = 0;
}
x += dx;
lx -= r;
if(my!=0)
{
_PutPixel(col+x,row-y,color);
my = 0;
}
else
mx = 1;
}
}
f -= abs(fx);
fx += 2;
if(fx==0 || fx<0 && fx-2>0 || fx>0 && fx-2<0)
{
dy = -dy;
fy = -fy+2;
f = -f;
}
}
else
{
ly += b;
if(ly>=r)
{
if(fill==2)
{
y += dy;
ly -= r;
draw_line(col+x,row-y,col,row,color);
}
else
{
if(my!=0)
{
_PutPixel(col+x,row-y,color);
my = 0;
}
y += dy;
ly -= r;
if(mx!=0)
{
_PutPixel(col+x,row-y,color);
mx = 0;
}
else
my = 1;
}
}
f += abs(fy);
fy += 2;
if(fy==0 || fy<0 && fy-2>0 || fy>0 && fy-2<0)
{
dx = -dx;
fx = -fx+2;
f = -f;
}
}
j--;
}
if(fill)
draw_line(col,row,col+x,row-y,color);
if(mx || my)
_PutPixel(col+x,row-y,color);
}