Question

Je crée une application qui se lit dans les fichiers SVG, les analyser et les redessiner en cacao à l'aide de NsBezierPath.Le chemin de vecteur suivant:

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

a l'air parfaitement bien dans l'illustrateur;C'est un segment court et ondulé.Dans mon application, la position est correcte, mais la courbe apparaît comme une ligne droite (voir les images ci-dessous).

illustrateur mon application

Que pourrais-je manquer?Vous trouverez ci-dessous ma routine de dessin, qui est alimentée à partir d'un tableau qui contient toutes les valeurs enregistrées dans différents modèles de vecteur.

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

Était-ce utile?

La solution

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top