citazione da Wikipedia: Superellipse
Per n = 1/2, in particolare, ciascuno dei quattro archi è una curva quadratica Bézier definito dai due assi; di conseguenza, ogni arco è un segmento di una parabola.
Quindi, perché non provare ad approssimare Squircle usando le curve di Bezier? Entrambe le curve (Bezier e Squircle) sono definite dalle equazioni parametriche.
UIBezierPath Class hanno Metodo: addCurveToPoint:controlPoint1:controlPoint2:
Aggiunge una curva di Bézier cubica al percorso del ricevitore.
NOTA: l'utilizzo del metodo addQuadCurveToPoint:controlPoint:
dà risultati peggiori, verificati.
Ho usato questo metodo e questo è quello che è successo in seguito:
red line
- rettangolo arrotondato, blue line
- rettangolo da quattro zampe curve di Bezier
Se questo risultato è interessato - disegno codice qui sotto .
NOTA: per ottenere una corrispondenza più esatta, è possibile che la curva di Bezier cambi le coordinate dei quattro corner points
(ora corrispondono agli angoli del rettangolo in cui è inscritta la figura).
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);
No, so come creare un rettangolo arrotondato; Sono davvero un superellisis di tipo squircle, che usano per le icone trampolino su iOS 7. –
@RemyVanherweghem Il metodo 'bezierPathWithRoundedRect' è stato modificato in iOS 7 per disegnare angoli più fluidi. Inoltre non sembra essere uno squircle: http://blog.mikeswanson.com/post/62341902567/unleashing-genetic-algorithms-on-the-ios-7-icon – millimoose
(Ciò detto, i metodi 'UIBezierPath' non producono una corrispondenza perfetta con il modello di icona, sono solo più vicini di quanto non fossero prima). – millimoose