www.pudn.com > ilib > IFillArc.c
/* * IDrawArc.c * * Image library * * Description: * Portable routines to manipulate raster images. * * History: * 19-Nov-99 Craig Knudsen cknudsen@radix.net * Created * ****************************************************************************/ #include#include #include #include #include #include "Ilib.h" #include "IlibP.h" IError IFillArc ( image, gc, x, y, r1, r2, a1, a2 ) IImage image; IGC gc; int x; int y; int r1; int r2; double a1; /* arc 1 (in degrees) */ double a2; /* arc 2 (in degrees) */ { IGCP *gcp = (IGCP *)gc; IImageP *imagep = (IImageP *)image; int N, loop; double a, da; IPoint *points; if ( ! gcp ) return ( IInvalidGC ); if ( gcp->magic != IMAGIC_GC ) return ( IInvalidGC ); if ( ! imagep ) return ( IInvalidImage ); if ( imagep->magic != IMAGIC_IMAGE ) return ( IInvalidImage ); /* because our y is upside down, make all angles their negative */ a1 = 360 - a1; a2 = 360 - a2; N = (int) fabs ( a2 - a1 ) + 9; a = a1 * 2.0 * PI / 360.0; da = ( a2 - a1 ) * ( 2.0 * PI / 360.0 ) / ( N - 1 ); points = (IPoint *) malloc ( sizeof ( IPoint ) * ( N + 1 ) ); for ( loop = 0; loop < N ; loop++ ) { points[loop].x = x + (int)( r1 * cos ( a + loop * da ) ); points[loop].y = y + (int)( r2 * sin ( a + loop * da ) ); } /* if we're not drawing a circle, add in the center point */ if ( a2 - a1 < 359.9 ) { points[N].x = x; points[N].y = y; IFillPolygon ( image, gc, points, N + 1 ); } else { IFillPolygon ( image, gc, points, N ); } free ( points ); return ( INoError ); }