我正試圖用UIBezierPath
繪製一個簡單的拋物線形狀。我有一個maxPoint
和一個boundingRect
其中我基於拋物線的寬度和拉伸。
這是我做得出拋物線函數(我畫在容器視圖中的拋物線,rect
會container.bounds
):不可靠的UIBezierPath曲線機制,controlPoint和曲線點
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
...
}
我的問題是,我想我在函數發送到maxPoint
成爲拋物線本身的實際極端點。例如,如果我發送(CGRectGetMidX(container.bounds), 0)
,最高點應該位於最頂端的中心。但是,在使用此功能與這個特殊的點,這是個什麼結果如下:
那麼究竟路徑在這裏所做的?或換句話說,我怎樣才能從controlPoint
到我需要的實際最大點?我試着根據boundingRect
的高度加上和減去y
值的不同值,但我找不到合適的組合,因爲在具有不同y
值的不同點中,它的行爲有所不同。似乎有某種倍增器被添加進來,我該如何解決它?
請注意,如果您的目標是創建位於一系列點上的平滑曲線,Catmull-Rom樣條曲線可能是比Bezier更好的選擇曲線。它們在計算上比Beziers更昂貴,它們創建了一條穿過所有控制點的曲線。然而,就像貝塞爾曲線一樣,如果你試圖曲線過於劇烈,你可能會在Catmull-Rom樣條中產生「扭結」。如果您有興趣,Erica Sadun出色的iOS Developer's Cookbook書籍中有Catmull-Rom樣條的工作代碼。 –
Catmull-Rom樣條曲線令人沮喪的是它們不包含第一個和最後一個點,因此您需要在「正確的位置」添加額外的擴展點。如果使用向心C-R樣條曲線(這是我通常偏好的原因),可以避免扭曲。 –