Я пытаюсь нарисовать простую форму параболы, используя UIBezierPath
. У меня есть maxPoint
и boundingRect
, из которых я основываю ширину и длину параболы.
Вот функция, которую я сделал, чтобы нарисовать параболу (рисую параболу в представлении контейнера, rect
будет container.bounds
):Неизбежный UIBezierPath изгибающий механизм, контрольная точка и точка кривой
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
до фактической максимальной точки, которая мне нужна? Я попытался добавить и вычесть разные значения из значения y
, основанного на высоте boundingRect
, но я не мог найти правильную комбинацию, так как в разных точках с разными значениями y
она ведет себя по-разному. Кажется, есть какой-то мультипликатор, который добавляется, как я могу его решить?
Обратите внимание, что если ваша цель - создать плавную кривую, лежащую на ряде точек, сплайны Catmull-Rom могут быть лучшим выбором, чем Bezier кривые. Они вычислительно дороже, чем Безье, они создают кривую, проходящую через все контрольные точки. Однако, как и кривые Безье, вы можете получить «перегибы» в сплайнах Catmull-Rom, если вы попытаетесь слишком резко нарисовать кривую. Отличные книги Erica Sadun от Cookies от iOS Developer имеют рабочий код для сплайнов Catmull-Rom, если вам интересно. –
Одна из неприятных особенностей сплайнов Catmull-Rom заключается в том, что они не включают в себя первую и последнюю точки, поэтому вам нужно добавить дополнительные точки расширения в «правильные места». Вы можете избежать изломов, если используете центростремительные сплайны C-R (которые являются моим обычным предпочтением именно по этой причине). –