Ich versuche, eine einfache Parabelform mit UIBezierPath
zu zeichnen. Ich habe eine maxPoint
und eine boundingRect
, von denen ich die Breite und Ausdehnung der Parabel basiere.
Hier ist die Funktion, die ich machte die Parabel zu zeichnen (I die Parabel in einem Container Ansicht ziehen, wird rect
container.bounds
sein):Unstanding UIBezierPath Krümmungsmechanismus, ControlPoint und der Kurvenpunkt
func addParabolaWithMax(maxPoint: CGPoint, inRect boundingRect: CGRect) {
let path = UIBezierPath()
let p1 = CGPointMake(1, CGRectGetMaxY(boundingRect)-1)
let p3 = CGPointMake(CGRectGetMaxX(boundingRect)-1, CGRectGetMaxY(boundingRect)-1)
path.moveToPoint(p1)
path.addQuadCurveToPoint(p3, controlPoint: maxPoint)
// Drawing code
...
}
Mein Problem ist, dass ich die maxPoint
wollen, dass ich in der Funktion senden sei der eigentliche Extrempunkt in der Parabel. Wenn ich zum Beispiel (CGRectGetMidX(container.bounds), 0)
einsende, sollte der maximale Punkt in der obersten Mitte sein. Aber diese Funktion bei der Verwendung mit diesem speziellen Punkt, das ist, was das Ergebnis wie folgt aussieht:
Was genau der Weg hier tut? Oder mit anderen Worten, wie kann ich vom controlPoint
zum tatsächlichen maximalen Punkt kommen, den ich benötige? Ich habe versucht, verschiedene Werte aus dem y
Wert, basierend auf der Höhe der boundingRect
, zu addieren und zu subtrahieren, aber ich konnte nicht die richtige Kombination finden, da in verschiedenen Punkten mit anderen Werten verhält es sich anders als y
. Es scheint eine Art Multiplikator hinzukommen, wie kann ich das lösen?
Wenn Sie eine glatte Kurve erstellen möchten, die auf einer Reihe von Punkten liegt, sind Catmull-Rom-Splines möglicherweise eine bessere Wahl als Bezier Kurven. Sie sind rechenintensiver als Beziers, sie erzeugen eine Kurve, die alle Kontrollpunkte durchläuft. Wie Bezier-Kurven können Sie jedoch in Catmull-Rom-Splines "Knicke" bekommen, wenn Sie versuchen, zu stark zu krümmen. Erica Sadun's ausgezeichnete iOS-Entwickler-Kochbuch Bücher hat Arbeitscode für Catmull-Rom Splines, wenn Sie interessiert sind. –
Eine frustrierende Sache bei Catmull-Rom-Splines ist, dass sie nicht den ersten und letzten Punkt enthalten, also müssen Sie zusätzliche Erweiterungspunkte an den "richtigen Stellen" hinzufügen. Sie können Knicke vermeiden, wenn Sie zentripetale C-R-Splines verwenden (was meine übliche Präferenz für genau diesen Grund ist). –