CGPath在两点之间添加曲线

4

我有一个函数,它随机生成一些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”是我想达到的效果:
[image]
在查看CGPath参考文献中可用的函数后,我可以看到一些可能完成工作的函数,如 CGPathAddArcToPoint CGPathAddCurveToPoint 。我试图使用这些函数,但没有能够获得所需的效果(可能是因为我使用它们不正确)。
你们能否指出我实现漂亮曲线的正确方法?
提前致谢。

注:您可以直接调用*[[coordinates objectAtIndex:i] CGPointValue];*,无需进行类型转换。 - Ramy Al Zuhouri
1个回答

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,但是你也可以使用面向对象编程的UIBezierPath代替CGPath,如果你觉得它更容易使用。

谢谢你的回答,我以为那是其中一个函数。 - Alec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接