Search code examples
iphoneobjective-cioscore-graphicsuibezierpath

Draw Graph curves with UIBezierPath


I'm drawing a graph in my application. My problem is that I want to draw line joining vertex points as curves. Currently I'm drawing them with UIBezierPath's function addLineToPoint:. I want to draw them as curves. I'm well aware that UIBezierPath has following two functions to support this feature.

Cubic curve:addCurveToPoint:controlPoint1:controlPoint2: Quadratic curve:addQuadCurveToPoint:controlPoint:

But problem is that I don't have control points. All i have is two end points. Neither I found a method/formula to determine control points. Can anyone help me here? I will appreciate if someone can suggest some alternative...


Solution

  • SO I found a work around based on @Fogmeister's answer.

        UIBezierPath *path = [UIBezierPath bezierPath];
        [path setLineWidth:3.0];
        [path setLineCapStyle:kCGLineCapRound];
        [path setLineJoinStyle:kCGLineJoinRound];
    
        // actualPoints are my points array stored as NSValue
    
        NSValue *value = [actualPoints objectAtIndex:0];
        CGPoint p1 = [value CGPointValue];
        [path moveToPoint:p1];
    
        for (int k=1; k<[actualPoints count];k++) {
    
            NSValue *value = [actualPoints objectAtIndex:k];
            CGPoint p2 = [value CGPointValue];
    
            CGPoint centerPoint = CGPointMake((p1.x+p2.x)/2, (p1.y+p2.y)/2);
    
            // See if your curve is decreasing or increasing
            // You can optimize it further by finding point on normal of line passing through midpoint 
    
            if (p1.y<p2.y) {
                 centerPoint = CGPointMake(centerPoint.x, centerPoint.y+(abs(p2.y-centerPoint.y)));
            }else if(p1.y>p2.y){
                 centerPoint = CGPointMake(centerPoint.x, centerPoint.y-(abs(p2.y-centerPoint.y)));
            }
    
            [path addQuadCurveToPoint:p2 controlPoint:centerPoint];
            p1 = p2;
        }
    
        [path stroke];