2012-01-16 1 views
0

Я нарисовал многоугольник, используя UIBezierPath. Мне нужно сделать его вершины изогнутыми. Как мне это сделать. Я использовал метод [path addLineToPoint: CGPointMake (xPoint, yPoint)] для рисования строк. Я попытался использовать [path addCurveToPoint: self.nextPoint controlPoint1: self.controlPoint controlPoint2: self.controlPoint]; Но не повезло. Любая помощь будет оценена.Выполнение острых краев (вершин) кривой многоугольника

Polygon that needs to be made smooth

ответ

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); 

Результирующее в:

Polygon with smoothed vertices