cytat z Treść: Superellipse
dla N = 1/2, w szczególności każdy z czterech łuków krzywą kwadratowa Bézier wyznaczone przez dwa osie; w rezultacie każdy łuk jest segmentem paraboli.
Dlaczego więc nie spróbować przybliżać Squircle za pomocą krzywych Beziera? Obie krzywe (Bezier i Squircle) są zdefiniowane przez równania parametryczne.
UIBezierPath Class mieć metodę: addCurveToPoint:controlPoint1:controlPoint2:
Dołącza Baziera krzywą ścieżki odbiornika.
UWAGA: Użycie metody addQuadCurveToPoint:controlPoint:
daje gorsze wyniki - testowane.
Użyłem tej metody, a to, co się stało w wyniku:
red line
- zaokrąglony prostokąt, blue line
- prostokąt z czwórki Beziera krzywe
Jeśli ten wynik jest zainteresowany - kod poniżej rysunek .
UWAGA: Aby uzyskać dokładniejsze dopasowanie, krzywa Béziera może być wymagana do zmiany współrzędnych czterech corner points
(teraz odpowiadają one kątom prostokąta, w którym wpisana jest cyfra).
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);
Nie, wiem, jak zrobić zaokrąglony prostokąt; Naprawdę jestem superelipis typu squircle, ponieważ używają one ikon do odskoku na iOS 7. –
@RemyVanherweghem Metoda 'bezierPathWithRoundedRect' została zmodyfikowana w iOS 7, aby rysować bardziej płynne rogi. Również nie wydaje się być squircle: http://blog.mikeswanson.com/post/62341902567/unleashing-genetic-algorithms-on-the-ios-7-icon – millimoose
(To powiedziawszy, metody 'UIBezierPath' nie produkuj idealnie pasującego do szablonu ikony, są one po prostu bliższe niż wcześniej). – millimoose