Вопрос

Я создаю приложение, которое читает в файлах 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 Мое приложение

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

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

Это было полезно?

Решение

The solution was quite simple...in long beziers, where values are concatenated as above, I wasn't clearing out the old data model before entering a new curve coordinate. All is well now.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top