CGPath在点之间添加曲线

时间:2013-06-18 18:28:52

标签: objective-c core-graphics curve cgpoint cgpath

所以我有一个随机生成一些CGPoints的函数,然后从这些点创建一个CGPath。我在关键帧动画中使用此路径来为屏幕周围的视图设置动画。

使用以下代码生成路径:

- (CGMutablePathRef)generatePathFromCoordinates:(NSArray *)coordinates
{
    CGMutablePathRef path = CGPathCreateMutable();
    CGPoint point = [(NSValue *)[coordinates objectAtIndex:0] CGPointValue];
    CGPathMoveToPoint(path, nil, point.x, point.y);

    for (int i=1; i < coordinates.count; i++)
    {
        point = [(NSValue *)[coordinates objectAtIndex:i] CGPointValue];
        CGPathAddLineToPoint(path, nil, point.x, point.y);
    }

    return path;   
}

上面的代码效果很好,但动画看起来有点奇怪,所以我想在坐标之间添加曲线而不是直线。如下图所示(我知道的惊人的绘画技巧!)。路径'A'是我正在做的事情,路径'B'是我的目标:

enter image description here

在查看CGPath参考中可用的函数后,我可以看到一些可能完成工作的CGPathAddArcToPoint CGPathAddCurveToPoint。我已经有一个简短的使用这些功能,但无法获得预期的效果(可能是因为我错误地使用它们)

你们能指出我正确的方向来获得一条漂亮的曲线吗?

提前致谢

1 个答案:

答案 0 :(得分:1)

CGPathAddCurveToPoint 将一条三次曲线添加到贝塞尔曲线路径。在您不知道的情况下,它的制作方式是曲线的形状由两个控制点确定(使用曲线的三级方程)。如果希望曲线具有特定形状,则需要计算两个中间点,偏向于路径当前点的值和曲线终点。相反,如果你不关心具有特定形状的曲线,你可以选择一些随机点。这是一个实现示例:

for (int i=1; i < coordinates.count; i++)
{
    point = [[coordinates objectAtIndex:i] CGPointValue];
    CGPathAddCurveToPoint(path, 0, randomX(), randomY(), randomX(), randomY(), point.x, point.y);
}

我看到你使用了 CGPath ,但如果你觉得它更容易使用,你也可以使用OOP和UIBezierPath代替 CGPath