Изображение, на которое вы ссылаетесь, является примером, в котором не используются квадратные кривые, поэтому я собираюсь работать с изображением, а не с кодом.
Путь Безье на ios (и os x)внизу в основном список команд и точек рисования.Например:
[path moveTo:CGMakePoint(1,1)];
[path curveToPoint:(10,10) controPoint1:(3,7) controlPoint2:(4,1)];
[path curveToPoint:(10,10) controPoint1:(15,17) controlPoint2:(21,11)];
[path closePath];
Результат:
moveto (1,1)
curveto (10,10) (3,7) (4,1)
curveto (20,0) (15,17) (21,11)
closepath
Контрольные точки на линии Безье управляют направлением и скоростью кривой вне точки.Первая контрольная точка (cp) контролирует направление и скорость кривой, выходящей из предыдущей точки, а вторая cp контролирует то же самое для точки, к которой вы поворачиваете.Для квадратичной кривой (которую вы получаете, используя addQuadCurveToPoint: controlPoint:), обе эти точки одинаковы, как вы можете видеть в документации для метода здесь .
Для получения плавной кривой вдоль набора точек cp1 и cp2 должны быть коллинеарны друг другу, и эта линия параллельна точкам на обоих концах этого сегмента.
Это будет выглядеть примерно так:
[path moveTo:2];
[path curveTo:3 controlPoint1:cp1 controlPoint2:cp2];
cp1 и cp2 можно вычислить, выбрав некоторую постоянную длину линии и выполнив некоторую геометрию (я забыл всемои уравнения линии прямо сейчас, но они легко googleable )
Использование # -> # для обозначения сегмента и # -> # (cp #) для обозначения контрольной точки длякривая этого сегмента для вызова.
Следующая проблема - сделать кривую гладкой из сегмента 2-> 3, переходящего в сегмент 3-> 4.На этом этапе в вашем коде у вас должна быть контрольная точка, рассчитанная для 2-> 3 (cp2).Принимая во внимание вашу постоянную длину линии, заданную ранее (это будет контролировать, насколько резкой будет ваша кривая), вы можете рассчитать cp1 для 3-> 4, получив коллинеарную точку с 2-> 3 (cp2) и точкой 3 на диаграмме.Затем вычислите 3-> 4 (cp2), который является коллинеарным с 3-> 4 (cp1) и параллельным линии, которая указывает точку 3 и точку 4.Промыть и повторить через массив точек.