NSBezierPath Cubic Bezier CurveTo выглядит как прямая линия - PullRequest
2 голосов
/ 21 февраля 2011

Я создаю приложение, которое читает файлы SVG, анализирует их и перерисовывает их в Какао, используя NSBezierPath.Следующий векторный путь:

M0 126C0.0507812 106.402 0.443359 78.6089 24.0781 76.0034 29.9937 75.3516 34.063 75.6162 39.6509 74 50.0083 71.0044 48.9268 69.8765 54.7329 60.0034 64.9927 42.5586 75.5684 42.8237 94.0801 42.0195 120.367 40.8779 127.438 2.28662 155.885 2.85254 156.091 1.86523 155.896 0.98877 156 0

прекрасно выглядит в Illustrator;это короткий, волнистый сегмент.В моем приложении позиция правильная, но кривая отображается в виде прямой линии (см. Изображения ниже).

Illustrator My application

Чего мне не хватать?Ниже приведена процедура рисования, которая заполняется массивом, в котором хранятся все значения, сохраненные в разных векторных моделях.

- (void)processImage
{
    float factorX = 1;
    float factorY = 1;

    debugLog(@"[sharedValues paths] is %lu long.", [[sharedValues paths]count]);

    NSArray *objectArray = [sharedValues paths];
    [[NSColor blackColor] set];
    aPath = [NSBezierPath bezierPath];
    [aPath moveToPoint:NSMakePoint(0.0, 0.0)];

    for(int i=0; i<[objectArray count]; i++) {
        debugLog(@"I am in iteration %i", i);
        if([[[objectArray objectAtIndex:i] type]isEqualToString:@"AbsoluteMoveTo"]){
            AbsoluteMoveToModel *model = [objectArray objectAtIndex:i];
            [aPath moveToPoint:NSMakePoint([model x] * factorX, [model y] * factorY)];
        } else if([[[objectArray objectAtIndex:i] type]isEqualToString:@"RelativeMoveTo"]){
            debugLog(@"Drawing a relative path moveto");
            RelativeMoveToModel *model = [objectArray objectAtIndex:i];
            [aPath relativeMoveToPoint:NSMakePoint([model x] * factorX, [model y] * factorY)];
        } else if([[[objectArray objectAtIndex:i] type]isEqualToString:@"AbsoluteLineTo"]){
            debugLog(@"Drawing an absolute path lineto");
            AbsoluteLineToModel *model = [objectArray objectAtIndex:i];
            [aPath lineToPoint:NSMakePoint([model x] * factorX, [model y] * factorY)];
        } else if([[[objectArray objectAtIndex:i] type]isEqualToString:@"RelativeLineTo"]){
            debugLog(@"Drawing a relative path lineto");
            RelativeLineToModel *model = [objectArray objectAtIndex:i];
            [aPath relativeLineToPoint:NSMakePoint([model x] * factorX, [model y] * factorY)];
            //[model release];
        } else if([[[objectArray objectAtIndex:i] type]isEqualToString:@"AbsoluteCurveTo"]){
            debugLog(@"Drawing an absolute path lineto");
            AbsoluteCubicBezierCurveToModel *model = [objectArray objectAtIndex:i];
            [aPath curveToPoint:NSMakePoint([model x] * factorX, [model y] * factorY) controlPoint1:NSMakePoint([model c1x] * factorX, [model c1y] * factorY) controlPoint2:NSMakePoint([model c2x] * factorX, [model c2y] * factorY)];
        } else if([[[objectArray objectAtIndex:i] type]isEqualToString:@"RelativeCurveTo"]){
            RelativeCubicBezierCurveToModel *model = [objectArray objectAtIndex:i];
            [aPath relativeCurveToPoint:NSMakePoint([model x] * factorX, [model y] * factorY) controlPoint1:NSMakePoint([model c1x] * factorX, [model c1y] * factorY) controlPoint2:NSMakePoint([model c2x] * factorX, [model c2y] * factorY)];
        } else if([[[objectArray objectAtIndex:i] type]isEqualToString:@"ClosePath"]){
            [aPath closePath];
        }
    }

    [aPath retain];
    //debugLog(@"%@", aPath);
    [self setNeedsDisplay:YES];
}

- (void)drawRect:(NSRect)rect
{
    //debugLog(@"%@", aPath);
    [[NSColor whiteColor] set];
    NSRectFill( rect );
    [[NSColor blackColor] set];
    [aPath stroke];
}

1 Ответ

1 голос
/ 22 февраля 2011

Решение было довольно простым ... в длинных Безье, где значения объединяются, как описано выше, я не очищал старую модель данных перед вводом новой координаты кривой. Теперь все хорошо.

...