gpt4 book ai didi

objective-c - 将 SVG 命令转换为 CoreGraphics

转载 作者:行者123 更新时间:2023-12-03 16:40:42 24 4
gpt4 key购买 nike

我正在查看从 Illustrator 保存的 SVG 文件。

我看到了这一行

<ellipse transform="matrix(-0.8796 -0.4758 0.4758 -0.8796 674.7629 282.6046)" fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" cx="373.15" cy="55.9" rx="58.003" ry="55.9"/> 

我正在尝试使用 CoreGraphics 绘制它

NSGraphicsContext * currentContext = [NSGraphicsContext currentContext];
CGContextRef ctx = (CGContextRef) [currentContext graphicsPort];

CGContextSetStrokeColorWithColor(ctx, [[NSColor blackColor] CGColor]);
CGContextSetLineWidth(ctx, 1.0);

CGRect ellipseRect = CGRectMake(373.15 - 58.003 ,55.9 + 55.9 ,58.003 * 2.0 , 55.9 *2.0);
CGContextMoveToPoint(ctx,ellipseRect.origin.x,self.bounds.size.height -ellipseRect.origin.y);
CGContextAddEllipseInRect(ctx, CGRectMake(ellipseRect.origin.x,self.bounds.size.height -ellipseRect.origin.y,ellipseRect.size.width,ellipseRect.size.height));
CGContextClosePath(ctx);
CGContextStrokePath(ctx);

CGContextDrawPath(ctx,kCGPathStroke);

这会绘制椭圆,但不是以 illustrator 中绘制的方式绘制,因为我没有应用变换。

现在我正在尝试应用转换。所以我正在这样做

NSGraphicsContext * currentContext = [NSGraphicsContext currentContext];
CGContextRef ctx = (CGContextRef) [currentContext graphicsPort];

CGContextSetStrokeColorWithColor(ctx, [[NSColor blackColor] CGColor]);
CGContextSetLineWidth(ctx, 1.0);

CGRect ellipseRect = CGRectMake(373.15 - 58.003 ,55.9 + 55.9 ,58.003 * 2.0 , 55.9 *2.0);
CGAffineTransform affineTransform = CGAffineTransformMake(-0.8796, -0.4758, 0.4758, -0.8796, 674.7629, 282.6046);
CGContextSaveGState(ctx);

CGFloat radians = atan2f(affineTransform.b, affineTransform.a);
CGFloat degrees = radians * (180 / M_PI);
CGContextRotateCTM(ctx, degrees);
CGContextTranslateCTM(ctx, 0-affineTransform.tx,0-affineTransform.ty);

CGContextMoveToPoint(ctx,ellipseRect.origin.x,self.bounds.size.height -ellipseRect.origin.y);
CGContextAddEllipseInRect(ctx, CGRectMake(ellipseRect.origin.x,self.bounds.size.height -ellipseRect.origin.y,ellipseRect.size.width,ellipseRect.size.height));

CGContextClosePath(ctx);

CGContextRestoreGState(ctx);

CGContextStrokePath(ctx);
CGContextDrawPath(ctx,kCGPathStroke);

这会旋转椭圆,但不是正确的方式,我真的不进行变换,任何人都可以解释我如何应用变换矩阵吗?

我知道有一些 SVG 渲染库,但它不适合我正在做的事情。

最佳答案

问题是我已经为 Windows 编程太多年了,而 mac 坐标系是不同的,所以通过添加这行代码它就可以工作了

CGContextScaleCTM(ctx, 1.0f * scaleX, -1.0f * scaleY);

缩放值就在那里,因此您还可以缩放图形

关于objective-c - 将 SVG 命令转换为 CoreGraphics,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31443598/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com