void GraphicWindow::ellipse(double center_x, double center_y, double ra, double rb)
{  
   int cx = user_to_disp_x(center_x);
   int cy = user_to_disp_y(center_y);
   double a = fabs(user_to_disp_dx(ra));
   double b = fabs(user_to_disp_dy(rb));
   
   int x = 0;
   int y = (int)(b + 0.5);
   double d1 = b * b - a * a * b + a * a / 4;
   set4(x, y, cx, cy);
   
   while (a * a * (y - 0.5) > b * b * (x + 1))
   {  
      if (d1 < 0)
      {  
         d1 += b * b * (2 * x + 3);
         x++;
      }
      else
      {  
         d1 += b * b * (2 * x + 3) + a * a * (-2 * y + 2);
         x++;
         y--;
      }
      set4(x, y, cx, cy);
   }
   
   double d2 = b * b * (x + 0.5) * (x + 0.5) + a * a * (y - 1) * (y - 1) - a * a * b * b;
   while (y > 0)
   {  
      if (d2 < 0)
      {  
         d2 += b * b * (2 * x + 2) + a * a * (-2 * y + 3);
         x++;
         y--;
      }
      else
      {  
         d2 += a * a * (-2 * y + 3);
         y--;
      }
      set4(x, y, cx, cy);
   }

   dirty = true;
}
Ejemplo n.º 2
0
void GraphicWindow::ellipse(double x, double y, double ra, double rb)
{  
   int disp_x = user_to_disp_x(x);
   int disp_y = user_to_disp_y(y);
   int disp_rx = abs(user_to_disp_dx(ra));
   int disp_ry = abs(user_to_disp_dy(rb));

   XSetForeground(display, xgc, BlackPixel(display, screen_num));
   XDrawArc(display, win, 
      xgc,               // the drawable
      disp_x - disp_rx,  // the x coord of upperleft corner of bounding rect
      disp_y - disp_ry,  // the y coord of upperleft corner of bounding rect
      disp_rx * 2,       // the major axis length
      disp_ry * 2,       // the minor axis length
      0,                 // offset from 3 o'clock  
      360 * 64);         // complete circle (360 degrees * 64 clicks per degree)
   XDrawArc(display, _ppm, xgc, disp_x - disp_rx, 
   disp_y - disp_ry, disp_rx * 2, disp_ry * 2, 0, 360 * 64);
}