Мне трудно понять метод curveToPoint: метод NSBezierPath

Я пытаюсь разобраться с рисованием (довольно простых) фигур в Какао. Я понимаю, как создавать пути с прямыми краями (да!), Но когда дело доходит до кривых, я просто не могу понять, какие входы будут давать кривую какой формы. В частности, я понятия не имею, как аргументы метода controlPoint1: и controlPoint2: влияют на форму.

Я пытаюсь приблизить форму вкладки в Google Chrome :

Google Chrome Tab

И код, который я использую, такой:

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

Я ужасно терплю неудачу.

Видите, вот почему у нас не может быть хороших вещей: (

My Attempt

Кто-нибудь может мне подсказать, как подумать, когда дело доходит до рисования кривых? Пример, который рисует этот путь, тоже был бы отличным, но на самом деле это ' Я просто понимаю эти входные данные для curveToPoint: controlPoint1: controlPoint2: , которые меня сдерживают.

UPDATE | Благодаря ответу @Aruman я, наконец, получил форму. Это не на 100% (отсутствуют кривые в нижних углах, но на самом деле это симметричная форма, по крайней мере, сейчас :)

Getting there

7
задан d11wtq 21 December 2010 в 15:04
поделиться