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よりも計算コストが高く、すべてのコントロールポイントを通過するカーブを作成します。しかし、ベジェ曲線のように、あまりにも急にカーブすると、Catmull-Romスプラインで「キンク」を得ることができます。 Erica Sadunの優れたiOSデベロッパー向けクックブックの書籍には、興味があればCatmull-Romスプラインの作業コードがあります。 –
Catmull-Romスプラインについての不満は、最初と最後の点が含まれていないことです。そのため、「正しい場所」に余分な拡張点を追加する必要があります。求心的なC-Rスプラインを使用すると、ねじれを防ぐことができます(これは私の通常の好みです)。 –