• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
[Solved]RE: Drawing elliptical curve using NSBezierPath
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Solved]RE: Drawing elliptical curve using NSBezierPath


  • Subject: [Solved]RE: Drawing elliptical curve using NSBezierPath
  • From: Vinay Prabhu <email@hidden>
  • Date: Thu, 21 Dec 2006 13:21:27 +0530
  • Importance: Normal

Thanks for the help,
This code works as I intented. Draws the elliptical arcs.

-Vinay

-----Original Message-----
From: cocoa-dev-bounces+vinayprabhu=email@hidden
[mailto:cocoa-dev-bounces+vinayprabhu=email@hidden]On
Behalf Of Gregory Weston
Sent: Thursday, December 21, 2006 6:58 AM
To: email@hidden
Subject: Re: Drawing elliptical curve using NSBezierPath


On Dec 20, 2006, at 2:38 PM, Shawn Erickson wrote:

> On 12/20/06, Vinay Prabhu <email@hidden> wrote:
>> I am trying to draw elliptical arc using NSBezierPath.
>> The arc must vary from Ellipse to Rect. Please see the attached
>> image. The
>> blue curve is the elliptical curve and the bounding rectangle is
>> stroked
>> with red color.
>> On windows, the arc is drawn using the addArc method.
>>
>> Is there any direct replacement for the addArc method on Mac to draw
>> elliptical curve?
>
> Review the following section in the Cocoa drawing guide...
>
> <http://developer.apple.com/documentation/Cocoa/Conceptual/
> CocoaDrawingGuide/Paths/chapter_6_section_1.html>
>
> ...in particular for your quesiton...
>
> <http://developer.apple.com/documentation/Cocoa/Conceptual/
> CocoaDrawingGuide/Paths/chapter_6_section_5.html#//apple_ref/doc/
> uid/TP40003290-CH206-BBCBGFBH>

But those are circular arcs and the OP asked about ellipses. I didn't
see the sample image because it got scrubbed from the message in
digest mode, but on the off chance the OP was looking to do the
traditional Mac OS roundrect shape, I've got a category on
NSBezierPath to do it.

@interface NSBezierPath (RoundRect)
+ (NSBezierPath*)bezierPathWithRoundRect:(NSRect)inRect
                                  xRadius:(float)inRadiusX
                                  yRadius:(float)inRadiusY;
@end

@implementation NSBezierPath (RoundRect)

+ (NSBezierPath*)bezierPathWithRoundRect:(NSRect)inRect
                                  xRadius:(float)inRadiusX
                                  yRadius:(float)inRadiusY
{
     const float kEllipseFactor = 0.55228474983079;

     float theMaxRadiusX = NSWidth(inRect) / 2.0;
     float theMaxRadiusY = NSHeight(inRect) / 2.0;
     float theRadiusX = (inRadiusX < theMaxRadiusX) ? inRadiusX :
theMaxRadiusX;
     float theRadiusY = (inRadiusY < theMaxRadiusY) ? inRadiusY :
theMaxRadiusY;
     float theControlX = theRadiusX * kEllipseFactor;
     float theControlY = theRadiusY * kEllipseFactor;
     NSRect theEdges = NSInsetRect(inRect, theRadiusX, theRadiusY);
     NSBezierPath* theResult = [NSBezierPath bezierPath];

     //	Lower edge and lower-right corner
     [theResult moveToPoint:NSMakePoint(theEdges.origin.x,
inRect.origin.y)];
     [theResult lineToPoint:NSMakePoint(NSMaxX(theEdges),
inRect.origin.y)];
     [theResult curveToPoint:NSMakePoint(NSMaxX(inRect),
theEdges.origin.y)
               controlPoint1:NSMakePoint(NSMaxX(theEdges) +
theControlX, inRect.origin.y)
               controlPoint2:NSMakePoint(NSMaxX(inRect),
theEdges.origin.y - theControlY)];

     //	Right edge and upper-right corner
     [theResult lineToPoint:NSMakePoint(NSMaxX(inRect), NSMaxY
(theEdges))];
     [theResult curveToPoint:NSMakePoint(NSMaxX(theEdges), NSMaxY
(inRect))
               controlPoint1:NSMakePoint(NSMaxX(inRect), NSMaxY
(theEdges) + theControlY)
               controlPoint2:NSMakePoint(NSMaxX(theEdges) +
theControlX, NSMaxY(inRect))];

     //	Top edge and upper-left corner
     [theResult lineToPoint:NSMakePoint(theEdges.origin.x, NSMaxY
(inRect))];
     [theResult curveToPoint:NSMakePoint(inRect.origin.x, NSMaxY
(theEdges))
               controlPoint1:NSMakePoint(theEdges.origin.x -
theControlX, NSMaxY(inRect))
               controlPoint2:NSMakePoint(inRect.origin.x, NSMaxY
(theEdges) + theControlY)];

     //	Left edge and lower-left corner
     [theResult lineToPoint:NSMakePoint(inRect.origin.x,
theEdges.origin.y)];
     [theResult curveToPoint:NSMakePoint(theEdges.origin.x,
inRect.origin.y)
               controlPoint1:NSMakePoint(inRect.origin.x,
theEdges.origin.y - theControlY)
               controlPoint2:NSMakePoint(theEdges.origin.x -
theControlX, inRect.origin.y)];


     //	Finish up and return
     [theResult closePath];
     return theResult;
}

@end

_______________________________________________

Cocoa-dev mailing list (email@hidden)

Do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
in

This email sent to email@hidden

_______________________________________________

Cocoa-dev mailing list (email@hidden)

Do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden

References: 
 >Re: Drawing elliptical curve using NSBezierPath (From: Gregory Weston <email@hidden>)

  • Prev by Date: Re: [Q] is it shallow copy or deep copy? and why things are not retrieved well?
  • Next by Date: Re: "compiling" .nibs?
  • Previous by thread: Re: Drawing elliptical curve using NSBezierPath
  • Next by thread: NaN passed to _regionForOpaqueDescendants from inside _drawRect:clip:
  • Index(es):
    • Date
    • Thread