很难理解NSBezierPath的curveToPoint:方法

d11*_*wtq 7 macos cocoa objective-c quartz-graphics

我正试图在Cocoa中掌握绘制(相当基本的)形状.我理解如何创建具有直边的路径(呃!),但是当涉及到做曲线时,我无法理解哪些输入会产生什么形状的曲线.具体而言,我不知道该怎么controlPoint1:controlPoint2:参数的方法影响的形状.

我正在尝试近似Google Chrome中标签的形状:

Google Chrome标签

我正在使用的代码是:

-(void)drawRect:(NSRect)dirtyRect {
    NSSize size = [self bounds].size;

    CGFloat height = size.height;
    CGFloat width = size.width;

    NSBezierPath *path = [NSBezierPath bezierPath];
    [path setLineWidth:1];

    [path moveToPoint:NSMakePoint(0, 0)];

    [path curveToPoint:NSMakePoint(width * 0.1, height)
         controlPoint1:NSMakePoint(width * 0.05, height)
         controlPoint2:NSMakePoint(width * 0.03, height * 0.05)];

    [path lineToPoint:NSMakePoint(width * 0.9, height)];

    [path curveToPoint:NSMakePoint(width, 0)
         controlPoint1:NSMakePoint(width * 0.95, height)
         controlPoint2:NSMakePoint(width * 0.97, height * 0.05)];

    [path closePath];

    [[NSColor colorWithCalibratedWhite:0.98 alpha:1] set];
    [path fill];

    [[NSColor colorWithCalibratedWhite:0.6 alpha:1] set];
    [path stroke];
}
Run Code Online (Sandbox Code Playgroud)

我失败的可怕.

看,这就是为什么我们不能有好东西:(

我的尝试

任何人都可以给我一些关于绘制曲线时如何思考的指示?绘制这条路径的一个例子也很棒,但实际上它只是理解这些输入curveToPoint:controlPoint1:controlPoint2:阻碍了我.

更新| 感谢@ Ahruman的回答,我终于开始成型了.它不是100%(缺少底角的曲线,但实际上它至少是对称的形状:)

到达那里

Jen*_*ton 9

当前绘图点(隐式)和控制点1之间的直线是曲线开始处的切线.控制点2和"到"点之间的直线是曲线末端的切线.这些对应于您在任何带有Bézier路径的矢量绘图应用程序中看到的两个切线控件的末端.如果您还没有使用过,那么Inkscape是免费的.


And*_*sne 6

下图说明了接受的答案,

CubicBézier曲线

控制点1是曲线开始处的切线.

这将是Bézier曲线中从起点到控制点1的虚线

控制点2和"到"点之间的直线是曲线末端的切线

这是端点和控制点2之间的虚线.

此图像来自Apple官方文档.