2016-04-06 14 views
0

Ben (x1, y1), (x2, y2), (x3, y3) gibi bazı noktaların ... iOS'ta düzgün eğri çizgi grafik nasıl çizilir?

Şimdi pürüzsüz eğri bir grafik çizmek istiyorum

?

Ben

-(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]; 
} 

ancak bazı durumlarda

,

gibi "geri dön" olacak hat bunu daha iyi bir yolu var mı aşağıda çizmeye çalışıyorum?

+0

Kare için gerçekten iyi bir örnek, https://github.com/jharwig/PPSSignatureView – Shailesh

cevap

0

Ben Draw Graph curves with UIBezierPath

yanıtı şu adreste Ve^_^

+ (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; 
} 

Teşekkür user1244109 kodu ile uygulamak deneyin.

İlgili konular