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); 
    }