home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.0 / NeXTSTEP3.0.iso / NextDeveloper / Examples / AppKit / Draw / Circle.m < prev    next >
Text File  |  1992-07-20  |  2KB  |  85 lines

  1. #import "draw.h"
  2.  
  3. /*
  4.  * This line is just a stub to get genstrings to generate
  5.  * a .strings file entry for the name of this type of Graphic.
  6.  * The name is used in the Undo New <Whatever> menu item.
  7.  *
  8.  * NXLocalString("Circle", NULL, "Name of the tool that draws ovals, i.e., the %s of the New %s operation.")
  9.  */
  10.  
  11. @implementation Circle : Graphic
  12.  
  13. + initialize
  14. /*
  15.  * This bumps the class version so that we can compatibly read
  16.  * old Graphic objects out of an archive.
  17.  */
  18. {
  19.     [Circle setVersion:1];
  20.     return self;
  21. }
  22.  
  23. - (Graphic *)colorAcceptorAt:(const NXPoint *)point
  24. /*
  25.  * An oval accepts a dropped color if the drop occurs
  26.  * within the bounds of the circle itself.
  27.  */
  28. {
  29.     if ([self hit:point]) return self;
  30.     return nil;
  31. }
  32.  
  33. - (float)naturalAspectRatio
  34. /*
  35.  * The natural aspect ratio of an oval is 1.0 (a circle).
  36.  */
  37. {
  38.     return 1.0;
  39. }
  40.  
  41. - draw
  42. {
  43.     if (bounds.size.width < 1.0 || bounds.size.height < 1.0) return self;
  44.  
  45.     if ([self fill]) {
  46.     PSgsave();
  47.     [self setFillColor];
  48.     PSFilledOval(bounds.origin.x, bounds.origin.y, bounds.size.width, bounds.size.height);
  49.     PSgrestore();
  50.     }
  51.     if (!gFlags.nooutline) {
  52.     [self setLineColor];
  53.     PSFramedOval(bounds.origin.x, bounds.origin.y, bounds.size.width, bounds.size.height);
  54.     }
  55.  
  56.     return self;
  57. }
  58.  
  59. - (BOOL)hit:(const NXPoint *)p
  60. /*
  61.  * Hit only if inside the interior of the oval.
  62.  */
  63. {
  64.     NXCoord x, y;
  65.     NXPointRTpter;
  66.     double angle, radius, diameter;
  67.  
  68.     if ([super hit:p]) {
  69.     center.x = bounds.origin.x + bounds.size.width / 2.0;
  70.     center.y = bounds.origin.y + bounds.size.height / 2.0;
  71.     diameter = MIN(bounds.size.width, bounds.size.height);
  72.     x = fabs(center.x - p->x) / (bounds.size.width / diameter);
  73.     y = fabs(center.y - p->y) / (bounds.size.height / diameter);
  74.     angle = atan2(y, x);
  75.     radius = diameter / 2.0;
  76.     return(x < radius * cos(angle) && y < radius * sin(angle));
  77.     } else {
  78.     return NO;
  79.     }
  80. }
  81.  
  82.  
  83. @end
  84.  
  85.