我正在创建一个应用程序,它读取SVG文件,解析它们,并使用NSBezierPath在Cocoa中重绘它们。以下矢量路径:
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];
}
答案 0 :(得分:1)
解决方案很简单......在长边框中,如上所述连接值,我在输入新的曲线坐标之前没有清除旧的数据模型。一切都很好。