2012-01-16 8 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スプラインを評価して描画します。

Polygon with smoothed vertices

:に結果の

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

関連する問題