www.pudn.com > ilib > IDrawArc.c


/*
 * IDrawArc.c
 *
 * Image library
 *
 * Description:
 *	Portable routines to manipulate raster images.
 *
 * History:
 *	28-Nov-99	Craig Knudsen	cknudsen@radix.net
 *			Added IDrawEnclosedArc()
 *	19-Nov-99	Craig Knudsen	cknudsen@radix.net
 *			Created
 *
 ****************************************************************************/

#include 
#include 
#include 
#include 
#include 

#include "Ilib.h"
#include "IlibP.h"



IError IDrawArc ( 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 myx, myy, lastx, lasty, N, loop;
  double a, da;

  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 ) + 8;
  a = a1 * 2.0 * PI / 360.0;
  da = ( a2 - a1 ) * ( 2.0 * PI / 360.0 ) / ( N - 1 );
  for ( loop = 0; loop < N ; loop++ ) {
    myx = x + (int)( r1 * cos ( a + loop * da ) );
    myy = y + (int)( r2 * sin ( a + loop * da ) );
    if ( loop )
      IDrawLine ( image, gc, lastx, lasty, myx, myy );
    lastx = myx;
    lasty = myy;
  }

  return ( INoError );
}





/*
** Draw an arc and connect it to the center point.
*/
IError IDrawEnclosedArc ( 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 myx, myy, lastx, lasty, N, loop;
  double a, da;

  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 ) + 8;
  a = a1 * 2.0 * PI / 360.0;
  da = ( a2 - a1 ) * ( 2.0 * PI / 360.0 ) / ( N - 1 );
  for ( loop = 0; loop < N ; loop++ ) {
    myx = x + (int)( r1 * cos ( a + loop * da ) );
    myy = y + (int)( r2 * sin ( a + loop * da ) );
    if ( loop )
      IDrawLine ( image, gc, lastx, lasty, myx, myy );
    if ( loop == N - 1 || loop == 0 )
      IDrawLine ( image, gc, x, y, myx, myy );
    lastx = myx;
    lasty = myy;
  }

  return ( INoError );
}