Что означают параметры для CGPathAddCurveToPoint?

Я хочу построить CGPathRef программно, основываясь на координатах Солнца в разные точки дня. Вычисление точек не является проблемой, но я хочу сделать CGPathRef гладкой и мысль CGPathAddCurveToPoint будет подходящей.

Я понимаю параметры path, transform, x и y, но я не уверен в других. По документации Apple они являются контрольными точками, и я предполагаю, что они похожи на то, что вы увидите в программе векторного рисования, где вы можете настроить способ прохождения кривой через точку.

Мой вопрос заключается в том, как выбирать точки, которые относятся к моим координатам, не зная, что эти координаты опережают время? Я думаю, что, может быть, просто вычтите установленную сумму из каждой из первых контрольных точек и добавьте ту же сумму ко второму контрольным точкам, но это звучит более упрощенно для меня. Существует ли стандартный метод для создания контрольных точек, которые "имеют смысл" для гладкой кривой?

void CGPathAddCurveToPoint (
   CGMutablePathRef path,
   const CGAffineTransform *m,
   CGFloat cp1x,
   CGFloat cp1y,
   CGFloat cp2x,
   CGFloat cp2y,
   CGFloat x,
   CGFloat y
); 

Ответ 1

Дополнительные точки - это контрольные точки безье для кривой из исходной (текущей) точки и кривой в целевую точку (см. http://en.wikipedia.org/wiki/Bézier_curve для общего объяснения). Линейный ток X, текущий Y - cp1x, cp1y - это вектор "out" текущей точки, а cp2x, cp2y - x, y - вектор "в" до конечной точки.

Разумный способ получения гладкой кривой от p1 до p2 (предполагая, что 4 точки p0, p1, p2, p3) (псевдокод):

v = (strength of curve from 0.0 to 1.0)
cp1x = p1.x+v*(p1.x-p0.x)
cp1y = p1.y+v*(p1.y-p0.y)
cp2x = p2.x-v*(p3.x-p2.x)
cp2y = p2.y-v*(p3.y-p2.y)

Для начальной точки установите cp1x, cp1y в начало x, y и для конечного набора точек cp2x, cp2y в конец x, y.

ПРИМЕЧАНИЕ. Я обновил ответ, чтобы включить комментарии из ughoavgfhw