IFillArc.c
资源名称:ilib [点击查看]
上传用户:changbiao
上传日期:2007-01-13
资源大小:141k
文件大小:2k
源码类别:

图片显示

开发平台:

C/C++

  1. /*
  2.  * IDrawArc.c
  3.  *
  4.  * Image library
  5.  *
  6.  * Description:
  7.  * Portable routines to manipulate raster images.
  8.  *
  9.  * History:
  10.  * 19-Nov-99 Craig Knudsen cknudsen@radix.net
  11.  * Created
  12.  *
  13.  ****************************************************************************/
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <ctype.h>
  17. #include <memory.h>
  18. #include <math.h>
  19. #include "Ilib.h"
  20. #include "IlibP.h"
  21. IError IFillArc ( image, gc, x, y, r1, r2, a1, a2 )
  22. IImage image;
  23. IGC gc;
  24. int x;
  25. int y;
  26. int r1;
  27. int r2;
  28. double a1; /* arc 1 (in degrees) */
  29. double a2; /* arc 2 (in degrees) */
  30. {
  31.   IGCP *gcp = (IGCP *)gc;
  32.   IImageP *imagep = (IImageP *)image;
  33.   int N, loop;
  34.   double a, da;
  35.   IPoint *points;
  36.   if ( ! gcp )
  37.     return ( IInvalidGC );
  38.   if ( gcp->magic != IMAGIC_GC )
  39.     return ( IInvalidGC );
  40.   if ( ! imagep )
  41.     return ( IInvalidImage );
  42.   if ( imagep->magic != IMAGIC_IMAGE )
  43.     return ( IInvalidImage );
  44.   /* because our y is upside down, make all angles their negative */
  45.   a1 = 360 - a1;
  46.   a2 = 360 - a2;
  47.   N = (int) fabs ( a2 - a1 ) + 9;
  48.   a = a1 * 2.0 * PI / 360.0;
  49.   da = ( a2 - a1 ) * ( 2.0 * PI / 360.0 ) / ( N - 1 );
  50.   points = (IPoint *) malloc ( sizeof ( IPoint ) * ( N + 1 ) );
  51.   for ( loop = 0; loop < N ; loop++ ) {
  52.     points[loop].x = x + (int)( r1 * cos ( a + loop * da ) );
  53.     points[loop].y = y + (int)( r2 * sin ( a + loop * da ) );
  54.   }
  55.   /* if we're not drawing a circle, add in the center point */
  56.   if ( a2 - a1 < 359.9 ) {
  57.     points[N].x = x;
  58.     points[N].y = y;
  59.     IFillPolygon ( image, gc, points, N + 1 );
  60.   } else {
  61.     IFillPolygon ( image, gc, points, N );
  62.   }
  63.   free ( points );
  64.   return ( INoError );
  65. }