2016-04-06 5 views
0

私は (X1、Y1)、(X2、Y2)、(X3、Y3)のようないくつかのポイントを持っている...iOSで滑らかな曲線を描くにはどうすればいいですか?

今、私は滑らかな曲線でグラフを描きたいですか?

それを行うための任意のより良い方法はあります私は

-(void)drawPrices 
{ 
    NSInteger count = self.prices.count; 

    UIBezierPath *path = [UIBezierPath bezierPath]; 
    path.lineCapStyle = kCGLineCapRound; 

    for(int i=0; i<count-1; i++) 
    { 
     CGPoint controlPoint[2]; 

     CGPoint p = [self pointWithIndex:i inData:self.prices]; 
     if(i==0) 
     { 
      [path moveToPoint:p]; 
     } 

     CGPoint nextPoint, previousPoint, m; 
     nextPoint = [self pointWithIndex:i+1 inData:self.prices]; 
     previousPoint = [self pointWithIndex:i-1 inData:self.prices]; 

     if(i > 0) { 
      m.x = (nextPoint.x - previousPoint.x)/2; 
      m.y = (nextPoint.y - previousPoint.y)/2; 
     } else { 
      m.x = (nextPoint.x - p.x)/2; 
      m.y = (nextPoint.y - p.y)/2; 
     } 

     controlPoint[0].x = p.x + m.x * 0.2; 
     controlPoint[0].y = p.y + m.y * 0.2; 

     // Second control point 
     nextPoint = [self pointWithIndex:i+2 inData:self.prices]; 
     previousPoint = [self pointWithIndex:i inData:self.prices]; 
     p = [self pointWithIndex:i + 1 inData:self.prices]; 
     m = zeroPoint; 

     if(i < self.prices.count - 2) { 
      m.x = (nextPoint.x - previousPoint.x)/2; 
      m.y = (nextPoint.y - previousPoint.y)/2; 
     } else { 
      m.x = (p.x - previousPoint.x)/2; 
      m.y = (p.y - previousPoint.y)/2; 
     } 

     controlPoint[1].x = p.x - m.x * 0.2; 
     controlPoint[1].y = p.y - m.y * 0.2; 

     [path addCurveToPoint:p controlPoint1:controlPoint[0] controlPoint2:controlPoint[1]]; 
    } 

    CAShapeLayer *lineLayer = [CAShapeLayer layer]; 
    lineLayer.path = path.CGPath; 
    lineLayer.lineWidth = LINE_WIDTH; 
    lineLayer.strokeColor = _priceColor.CGColor; 
    lineLayer.fillColor = [UIColor clearColor].CGColor; 

    [self.layer addSublayer:lineLayer]; 
} 

以下のように描画しようとしているが、いくつかの状況では、ラインは

のように「戻る」のだろうか?

+0

ここはSquareの本当に良い例です。https://github.com/jharwig/PPSSignatureView – Shailesh

答えて

0

私はDraw Graph curves with UIBezierPath

で答えを見つけて、コードで^ _^user1244109

+ (UIBezierPath *)quadCurvedPathWithPoints:(NSArray *)points 
{ 
    UIBezierPath *path = [UIBezierPath bezierPath]; 

    NSValue *value = points[0]; 
    CGPoint p1 = [value CGPointValue]; 
    [path moveToPoint:p1]; 

    if (points.count == 2) { 
     value = points[1]; 
     CGPoint p2 = [value CGPointValue]; 
     [path addLineToPoint:p2]; 
     return path; 
    } 

    for (NSUInteger i = 1; i < points.count; i++) { 
     value = points[i]; 
     CGPoint p2 = [value CGPointValue]; 

     CGPoint midPoint = midPointForPoints(p1, p2); 
     [path addQuadCurveToPoint:midPoint controlPoint:controlPointForPoints(midPoint, p1)]; 
     [path addQuadCurveToPoint:p2 controlPoint:controlPointForPoints(midPoint, p2)]; 

     p1 = p2; 
    } 
    return path; 
} 

static CGPoint midPointForPoints(CGPoint p1, CGPoint p2) { 
    return CGPointMake((p1.x + p2.x)/2, (p1.y + p2.y)/2); 
} 

static CGPoint controlPointForPoints(CGPoint p1, CGPoint p2) { 
    CGPoint controlPoint = midPointForPoints(p1, p2); 
    CGFloat diffY = abs(p2.y - controlPoint.y); 

    if (p1.y < p2.y) 
     controlPoint.y += diffY; 
    else if (p1.y > p2.y) 
     controlPoint.y -= diffY; 

    return controlPoint; 
} 

感謝を実装してみてください。

関連する問題