цитата из Википедии: Superellipse
при п = 1/2, в частности, каждый из четырех дуг является кривым Безье Квадратичного определяется два оси; в результате каждая дуга является отрезком параболы.
Так почему бы не попытаться приблизиться к Squircle, используя кривые Безье? Обе кривые (Безье и Сквирль) определяются параметрическими уравнениями.
UIBezierPath Class есть метод: addCurveToPoint:controlPoint1:controlPoint2:
присоединяет кубическую Безье кривого пути приемника.
ПРИМЕЧАНИЕ: Использование метода addQuadCurveToPoint:controlPoint:
дает худшие результаты - проверено.
Я использовал этот метод, и вот что получилось в результате:
red line
- прямоугольник с закругленными углами, blue line
- прямоугольник из четверок кривых Безье
Если этот результат интересно - рисунок ниже код ,
ПРИМЕЧАНИЕ. Для достижения более точного соответствия кривой Безье может потребоваться изменить координаты четырех corner points
(теперь они соответствуют углам прямоугольника, на котором изображена фигура).
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
//set rect size for draw
float rectSize = 275.;
CGRect rectangle = CGRectMake(CGRectGetMidX(rect) - rectSize/2, CGRectGetMidY(rect) - rectSize/2, rectSize, rectSize);
//Rounded rectangle
CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
UIBezierPath* roundedPath = [UIBezierPath bezierPathWithRoundedRect:rectangle cornerRadius:rectSize/4.7];
[roundedPath stroke];
//Rectangle from Fours Bezier Curves
CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);
UIBezierPath *bezierCurvePath = [UIBezierPath bezierPath];
//set coner points
CGPoint topLPoint = CGPointMake(CGRectGetMinX(rectangle), CGRectGetMinY(rectangle));
CGPoint topRPoint = CGPointMake(CGRectGetMaxX(rectangle), CGRectGetMinY(rectangle));
CGPoint botLPoint = CGPointMake(CGRectGetMinX(rectangle), CGRectGetMaxY(rectangle));
CGPoint botRPoint = CGPointMake(CGRectGetMaxX(rectangle), CGRectGetMaxY(rectangle));
//set start-end points
CGPoint midRPoint = CGPointMake(CGRectGetMaxX(rectangle), CGRectGetMidY(rectangle));
CGPoint botMPoint = CGPointMake(CGRectGetMidX(rectangle), CGRectGetMaxY(rectangle));
CGPoint topMPoint = CGPointMake(CGRectGetMidX(rectangle), CGRectGetMinY(rectangle));
CGPoint midLPoint = CGPointMake(CGRectGetMinX(rectangle), CGRectGetMidY(rectangle));
//Four Bezier Curve
[bezierCurvePath moveToPoint:midLPoint];
[bezierCurvePath addCurveToPoint:topMPoint controlPoint1:topLPoint controlPoint2:topLPoint];
[bezierCurvePath moveToPoint:midLPoint];
[bezierCurvePath addCurveToPoint:botMPoint controlPoint1:botLPoint controlPoint2:botLPoint];
[bezierCurvePath moveToPoint:midRPoint];
[bezierCurvePath addCurveToPoint:topMPoint controlPoint1:topRPoint controlPoint2:topRPoint];
[bezierCurvePath moveToPoint:midRPoint];
[bezierCurvePath addCurveToPoint:botMPoint controlPoint1:botRPoint controlPoint2:botRPoint];
[bezierCurvePath stroke];
CGContextRestoreGState(context);
Нет Я знаю, как сделать закругленный прямоугольник; Я действительно суперэллипсис типа squircle, поскольку они используют для значков трамплинов на iOS 7. –
@RemyVanherweghem. Метод 'bezierPathWithRoundedRect' был изменен в iOS 7, чтобы нарисовать более гладкие углы. Кроме того, это не похоже на шквал: http://blog.mikeswanson.com/post/62341902567/unleashing-genetic-algorithms-on-the-ios-7-icon – millimoose
(Тем не менее, методы 'UIBezierPath' не создавайте идеальное совпадение с шаблоном значков, они просто ближе, чем раньше). – millimoose