Что означают параметры для 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%C3%A9zier_curve). Линия currentX,currentY - cp1x,cp1y - это вектор 'out' текущей точки, а cp2x,cp2y - x, y - вектор 'in' до конечной точки.

Разумный способ получения гладкой кривой от 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

Другие вопросы по тегам