Beispiel #1
0
/*>ScreenFillArc(struct RastPort *RasP, int xc, int yc, int size,
                 double start, double end)
   --------------------------------------------------------------
   Draws a filled arc on the Amiga screen.
   17.06.92 Original
   18.06.92 Fixed arc length for large angles.
*/
int ScreenFillArc(struct RastPort   *RasP,
              int               xc,
              int               yc,
              int               size,
              double            start,
              double            end)
{
   int      x1,   y1,
            x2,   y2;
   double   length,
            step,
            range,
            ang;
            
   if(end == start) return(0);

   x1 = (int)((double)size *  cos(start));
   y1 = (int)((double)size * -sin(start));
   x2 = (int)((double)size *  cos(end));
   y2 = (int)((double)size * -sin(end));
   
   /* Draw in side of slice */
   AreaMove(RasP, xc, yc);
   AreaDraw(RasP, x1+xc, y1+yc);
   
   /* Find angular size of arc */
   if(end > start)  range = end-start;
   else             range = end + (360.0 - start);
   
   /* Find approximate length of arc. In radians, the following equation
      applies for calc of length of arc:
      Radius = 2 PI r
      Arc length = Radius * (arc angle/2 PI)
   => Arc length = r * arc angle
   */
   length = range * size;
   if(length == 0.0) return(0);
   
   /* Find angular step for approx 5 pixels */
   step = 5.0 * range/length;
   
   /* Draw the arc */
   for(ang=start; ang<=end; ang+=step)
   {
      x1 = (int)((double)size *  cos(ang));
      y1 = (int)((double)size * -sin(ang));
      /* Draw segment */
      AreaDraw(RasP, x1+xc, y1+yc);
   }
   
   /* Draw final segment */
   if((ang-step < end) && (ang-step > end-step)) AreaDraw(RasP, x2+xc, y2+yc);
   
   /* Close and end */
   AreaDraw(RasP, xc, yc);
   AreaEnd(RasP);
   
   return(0);
}
VOID SafeAreaEnd (struct RastPort *rp)
{
	int i;

	if (clp_nvert > 0) {
		SafeAreaDraw(clp_vert[0].x, clp_vert[0].y); // close area
		clp_nvert = Clip2d(clp_nvert);
		AreaMove(rp, clp_vert[0].x, clp_vert[0].y);
		for (i = 1; i < clp_nvert; i++) {
			AreaDraw(rp, clp_vert[i].x, clp_vert[i].y);
		}
		AreaEnd(rp);
		clp_nvert = 0;
	}
}
Beispiel #3
0
/*>ScreenMark(struct RastPort *RasP, int xscreen, int yscreen, 
              int mark, double dpsize)
   -----------------------------------------------------------
   Draw the appropriate mark on the Amiga screen
   06.05.92 Original
*/
int ScreenMark(struct RastPort *RasP,
           int             xscreen, 
           int             yscreen, 
           int             mark, 
           double          dpsize)
{
   int         size,
               j,
               *offset;
   static int  warned   = FALSE;
   
   size = (int)(dpsize / 4.0);
   
   switch(mark)
   {
   case 0:                             /* No mark                          */
      break;
   case 1:                             /* Cross                            */
      Move(RasP,  xscreen-size,     yscreen-size);
      Draw(RasP,  xscreen+size,     yscreen+size);
      Move(RasP,  xscreen-size,     yscreen+size);
      Draw(RasP,  xscreen+size,     yscreen-size);
      break;
   case 2:                             /* Open square                      */
      Move(RasP,  xscreen-size,     yscreen-size);
      Draw(RasP,  xscreen-size,     yscreen+size);
      Draw(RasP,  xscreen+size,     yscreen+size);
      Draw(RasP,  xscreen+size,     yscreen-size);
      Draw(RasP,  xscreen-size,     yscreen-size);
      break;
   case 3:                             /* Filled square                    */
      RectFill(RasP,xscreen-size,yscreen-size,xscreen+size,yscreen+size);
      break;
   case 4:                             /* Open circle                      */
      if((offset = (int *)malloc((size+1) * sizeof(int)))==NULL)
      {
         if(!warned)
         {
            ReqMessage(MainWind,"No memory for circle",0);
            warned = TRUE;
            break;
         }
      }

      for(j=0; j<=size; j++) 
         offset[j] = (int)(0.5+sqrt((double)((size*size) - (j*j))));

      Move(RasP,xscreen,yscreen+size);
      /* First quadrant */
      for(j=1;j<=size;j++)   Draw(RasP, xscreen+j, yscreen+offset[j]);
      /* Second quadrant */
      for(j=size-1;j>=0;j--) Draw(RasP, xscreen+j, yscreen-offset[j]);
      /* Third quadrant */
      for(j=1;j<=size;j++)   Draw(RasP, xscreen-j, yscreen-offset[j]);
      /* Fourth quadrant */
      for(j=size-1;j>=0;j--) Draw(RasP, xscreen-j, yscreen+offset[j]);

      free(offset);
      break;
   case 5:                             /* Filled circle                    */
      if((offset = (int *)malloc((size+1) * sizeof(int)))==NULL)
      {
         if(!warned)
         {
            ReqMessage(MainWind,"No memory for circle",0);
            warned = TRUE;
            break;
         }
      }

      for(j=0; j<=size; j++) 
         offset[j] = (int)(0.5+sqrt((double)((size*size) - (j*j))));

      AreaMove(RasP,xscreen,yscreen+size);
      /* First quadrant */
      for(j=1;j<=size;j++)   AreaDraw(RasP, xscreen+j, yscreen+offset[j]);
      /* Second quadrant */
      for(j=size-1;j>=0;j--) AreaDraw(RasP, xscreen+j, yscreen-offset[j]);
      /* Third quadrant */
      for(j=1;j<=size;j++)   AreaDraw(RasP, xscreen-j, yscreen-offset[j]);
      /* Fourth quadrant */
      for(j=size-1;j>=0;j--) AreaDraw(RasP, xscreen-j, yscreen+offset[j]);
      AreaEnd(RasP);
   
      free(offset);
      break;
   case 6:                             /* Open diamond                     */
      Move(RasP,     xscreen-size,  yscreen);
      Draw(RasP,     xscreen,       yscreen+size);
      Draw(RasP,     xscreen+size,  yscreen);
      Draw(RasP,     xscreen,       yscreen-size);
      Draw(RasP,     xscreen-size,  yscreen);
      break;
   case 7:                             /* Filled diamond                   */
      AreaMove(RasP, xscreen-size,  yscreen);
      AreaDraw(RasP, xscreen,       yscreen+size);
      AreaDraw(RasP, xscreen+size,  yscreen);
      AreaDraw(RasP, xscreen,       yscreen-size);
      AreaDraw(RasP, xscreen-size,  yscreen);
      AreaEnd(RasP);
      break;
   case 8:                             /* Open triangle                    */
      Move(RasP,     xscreen-size,  yscreen+size);
      Draw(RasP,     xscreen,       yscreen-size);
      Draw(RasP,     xscreen+size,  yscreen+size);
      Draw(RasP,     xscreen-size,  yscreen+size);
      break;
   case 9:                             /* Filled triangle                  */
      AreaMove(RasP, xscreen-size,  yscreen+size);
      AreaDraw(RasP, xscreen,       yscreen-size);
      AreaDraw(RasP, xscreen+size,  yscreen+size);
      AreaDraw(RasP, xscreen-size,  yscreen+size);
      AreaEnd(RasP);
      break;
   case 10:                            /* Open inverted triangle           */
      Move(RasP,     xscreen-size,  yscreen-size);
      Draw(RasP,     xscreen,       yscreen+size);
      Draw(RasP,     xscreen+size,  yscreen-size);
      Draw(RasP,     xscreen-size,  yscreen-size);
      break;
   case 11:                            /* Filled inverted triangle         */
      AreaMove(RasP, xscreen-size,  yscreen-size);
      AreaDraw(RasP, xscreen,       yscreen+size);
      AreaDraw(RasP, xscreen+size,  yscreen-size);
      AreaDraw(RasP, xscreen-size,  yscreen-size);
      AreaEnd(RasP);
      break;
   case 12:                            /* Plus sign                        */
      Move(RasP,  xscreen-size,     yscreen);
      Draw(RasP,  xscreen+size,     yscreen);
      Move(RasP,  xscreen,          yscreen+size);
      Draw(RasP,  xscreen,          yscreen-size);
      break;
   default:
      break;
   }

   Move(RasP,xscreen,yscreen);

   return(0);
}