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

图片显示

开发平台:

C/C++

  1. /*
  2.  * IDrawArc.c
  3.  *
  4.  * Image library
  5.  *
  6.  * Description:
  7.  * Portable routines to manipulate raster images.
  8.  *
  9.  * History:
  10.  * 28-Nov-99 Craig Knudsen cknudsen@radix.net
  11.  * Added IDrawEnclosedArc()
  12.  * 19-Nov-99 Craig Knudsen cknudsen@radix.net
  13.  * Created
  14.  *
  15.  ****************************************************************************/
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <ctype.h>
  19. #include <memory.h>
  20. #include <math.h>
  21. #include "Ilib.h"
  22. #include "IlibP.h"
  23. IError IDrawArc ( image, gc, x, y, r1, r2, a1, a2 )
  24. IImage image;
  25. IGC gc;
  26. int x;
  27. int y;
  28. int r1;
  29. int r2;
  30. double a1; /* arc 1 (in degrees) */
  31. double a2; /* arc 2 (in degrees) */
  32. {
  33.   IGCP *gcp = (IGCP *)gc;
  34.   IImageP *imagep = (IImageP *)image;
  35.   int myx, myy, lastx, lasty, N, loop;
  36.   double a, da;
  37.   if ( ! gcp )
  38.     return ( IInvalidGC );
  39.   if ( gcp->magic != IMAGIC_GC )
  40.     return ( IInvalidGC );
  41.   if ( ! imagep )
  42.     return ( IInvalidImage );
  43.   if ( imagep->magic != IMAGIC_IMAGE )
  44.     return ( IInvalidImage );
  45.   /* because our y is upside down, make all angles their negative */
  46.   a1 = 360 - a1;
  47.   a2 = 360 - a2;
  48.   N = (int) fabs ( a2 - a1 ) + 8;
  49.   a = a1 * 2.0 * PI / 360.0;
  50.   da = ( a2 - a1 ) * ( 2.0 * PI / 360.0 ) / ( N - 1 );
  51.   for ( loop = 0; loop < N ; loop++ ) {
  52.     myx = x + (int)( r1 * cos ( a + loop * da ) );
  53.     myy = y + (int)( r2 * sin ( a + loop * da ) );
  54.     if ( loop )
  55.       IDrawLine ( image, gc, lastx, lasty, myx, myy );
  56.     lastx = myx;
  57.     lasty = myy;
  58.   }
  59.   return ( INoError );
  60. }
  61. /*
  62. ** Draw an arc and connect it to the center point.
  63. */
  64. IError IDrawEnclosedArc ( image, gc, x, y, r1, r2, a1, a2 )
  65. IImage image;
  66. IGC gc;
  67. int x;
  68. int y;
  69. int r1;
  70. int r2;
  71. double a1; /* arc 1 (in degrees) */
  72. double a2; /* arc 2 (in degrees) */
  73. {
  74.   IGCP *gcp = (IGCP *)gc;
  75.   IImageP *imagep = (IImageP *)image;
  76.   int myx, myy, lastx, lasty, N, loop;
  77.   double a, da;
  78.   if ( ! gcp )
  79.     return ( IInvalidGC );
  80.   if ( gcp->magic != IMAGIC_GC )
  81.     return ( IInvalidGC );
  82.   if ( ! imagep )
  83.     return ( IInvalidImage );
  84.   if ( imagep->magic != IMAGIC_IMAGE )
  85.     return ( IInvalidImage );
  86.   /* because our y is upside down, make all angles their negative */
  87.   a1 = 360 - a1;
  88.   a2 = 360 - a2;
  89.   N = (int) fabs ( a2 - a1 ) + 8;
  90.   a = a1 * 2.0 * PI / 360.0;
  91.   da = ( a2 - a1 ) * ( 2.0 * PI / 360.0 ) / ( N - 1 );
  92.   for ( loop = 0; loop < N ; loop++ ) {
  93.     myx = x + (int)( r1 * cos ( a + loop * da ) );
  94.     myy = y + (int)( r2 * sin ( a + loop * da ) );
  95.     if ( loop )
  96.       IDrawLine ( image, gc, lastx, lasty, myx, myy );
  97.     if ( loop == N - 1 || loop == 0 )
  98.       IDrawLine ( image, gc, x, y, myx, myy );
  99.     lastx = myx;
  100.     lasty = myy;
  101.   }
  102.   return ( INoError );
  103. }