public static NSBezierPath CreatePolygonPath(this CGRect rect, int sides, double cornerRadius = 0.0, double rotationOffset = 0.0) { var offsetRadians = rotationOffset * Math.PI / 180; var path = new NSBezierPath(); var theta = 2 * Math.PI / sides; var width = (-cornerRadius + Math.Min(rect.Size.Width, rect.Size.Height)) / 2; var center = new CGPoint(rect.Width / 2, rect.Height / 2); var radius = width + cornerRadius - (Math.Cos(theta) * cornerRadius) / 2; var angle = offsetRadians; var corner = new CGPoint(center.X + (radius - cornerRadius) * Math.Cos(angle), center.Y + (radius - cornerRadius) * Math.Sin(angle)); path.MoveTo(new CGPoint(corner.X + cornerRadius * Math.Cos(angle + theta), corner.Y + cornerRadius * Math.Sin(angle + theta))); for (var i = 0; i < sides; i++) { angle += theta; corner = new CGPoint(center.X + (radius - cornerRadius) * Math.Cos(angle), center.Y + (radius - cornerRadius) * Math.Sin(angle)); var tip = new CGPoint(center.X + radius * Math.Cos(angle), center.Y + radius * Math.Sin(angle)); var start = new CGPoint(corner.X + cornerRadius * Math.Cos(angle - theta), corner.Y + cornerRadius * Math.Sin(angle - theta)); var end = new CGPoint(corner.X + cornerRadius * Math.Cos(angle + theta), corner.Y + cornerRadius * Math.Sin(angle + theta)); path.AddLineTo(start); path.AddQuadCurveToPoint(end, tip); } path.ClosePath(); return(path); }