引用:投稿@millimooseリンク参照Superellipse
についてN = 1/2、特に4つの弧の各々は、二次ベジエ曲線 2で定義されます軸;結果として、各円弧は放物線のセグメントです。
なぜ、Squircleをベジェ曲線で近似しようとしないのですか?両方の曲線(ベジェとスクエア)は、パラメトリック方程式によって定義されます。
UIBezierPath Classは方法があります:addCurveToPoint:controlPoint1:controlPoint2:
は、受信機のパス立方ベジェ曲線を追加します。
注:addQuadCurveToPoint:controlPoint:
メソッドを使用すると、結果が悪化します。
私は、このメソッドを使用し、それが結果として何が起こったのです。
red line
- 角丸矩形、blue line
- 矩形を四つんばいベジェ曲線
から、この結果は関心がある場合 - 以下のコードを描画します。
注:より正確なマッチングを実現するには、4つの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 iOS 7では、 'bezierPathWithRoundedRect'メソッドが変更され、よりスムーズなコーナーが描かれました。また、それはsquircleではないようです:http://blog.mikeswanson.com/post/62341902567/unleashing-genetic-algorithms-on-the-ios-7-icon – millimoose
(つまり、 'UIBezierPath'メソッドアイコンテンプレートと完全に一致するものはありません。以前よりももっと近づいています)。 – millimoose