Что означают параметры для CGPathAddCurveToPoint? - PullRequest
10 голосов
/ 13 декабря 2010

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

Я понимаю параметры пути, преобразования, x и y, но яЯ не уверен в других.Согласно документации Apple, они являются контрольными точками, и я предполагаю, что они похожи на те, что вы могли бы увидеть в программе векторного рисования, где вы можете настроить способ прохождения кривой через точку.выбрать точки, которые относятся к моим координатам, не зная, какие эти координаты опережают время?Я думаю, может быть, просто вычесть определенное количество из каждой из первых контрольных точек и добавить такое же количество ко вторым контрольным точкам, но это звучит слишком упрощенно для меня.Существует ли стандартный метод создания контрольных точек, которые «имеют смысл» для гладкой кривой?

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

1 Ответ

6 голосов
/ 13 декабря 2010

Дополнительные точки являются контрольными точками Безье для кривой из исходной (текущей) точки и кривой в целевую точку (общее объяснение см. http://en.wikipedia.org/wiki/Bézier_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

...