Pregunta

Estoy creando una aplicación que se lee en los archivos SVG, los analiza y los redondea en cacao usando NSBezierpath.La siguiente ruta del vector:

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

se ve perfectamente bien en Ilustrador;Es un segmento corto y ondulado.En mi aplicación, la posición es correcta, pero la curva se muestra como una línea recta (vea las imágenes a continuación).

ilustrador Mi aplicación

¿Qué me podría perder?A continuación se muestra mi rutina de dibujo, que se alimenta de una matriz que sostiene todos los valores guardados en diferentes modelos vectoriales.

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

¿Fue útil?

Solución

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top