Я нарисовал многоугольник, используя UIBezierPath. Мне нужно сделать его вершины изогнутыми. Как мне это сделать. Я использовал метод [path addLineToPoint: CGPointMake (xPoint, yPoint)] для рисования строк. Я попытался использовать [path addCurveToPoint: self.nextPoint controlPoint1: self.controlPoint controlPoint2: self.controlPoint]; Но не повезло. Любая помощь будет оценена.Выполнение острых краев (вершин) кривой многоугольника
0
A
ответ
1
Это зависит от того, что ваши намерения. Если вам нужно, чтобы ваша кривая проходила через каждую вершину, вам было бы лучше использовать другой сплайн, такой как сплайны Catmull-Rom. Они имеют полезное свойство прохождения через все контрольные точки кривой. Кривые Безье не обладают этим свойством; вместо этого кривая ограничена выпуклой оболочкой контрольных точек. Вы также должны знать, что вам придется использовать сплав произвольно высокого порядка, чтобы избежать самопересечения, когда ваши контрольные точки очень близки друг к другу.
Если у вас есть правильные контрольные точки уже по часовой стрелке или против часовой стрелки, следующий код будет оценивать и нарисовать закрытый сплайн Catmull-Rom, соединяющий точки.
#define SMOOTHNESS 20
for(NSUInteger i = 0; i <= pointCount; ++i) {
CGPoint p0 = points[(i + 0) % pointCount];
CGPoint p1 = points[(i + 1) % pointCount];
CGPoint p2 = points[(i + 2) % pointCount];
CGPoint p3 = points[(i + 3) % pointCount];
for(CGFloat t = 0; t <= 1; t += 1.0/SMOOTHNESS) {
CGFloat t2 = t*t, t3 = t * t * t;
CGFloat x = 0.5 *((2 * p1.x) + (-p0.x + p2.x) * t + (2*p0.x - 5*p1.x + 4*p2.x - p3.x) * t2 + (-p0.x + 3*p1.x- 3*p2.x + p3.x) * t3);
CGFloat y = 0.5 *((2 * p1.y) + (-p0.y + p2.y) * t + (2*p0.y - 5*p1.y + 4*p2.y - p3.y) * t2 + (-p0.y + 3*p1.y- 3*p2.y + p3.y) * t3);
if(i == 0 && t == 0)
CGContextMoveToPoint(context, x, y);
else
CGContextAddLineToPoint(context, x, y);
}
}
CGContextStrokePath(context);
Результирующее в: