gpt4 book ai didi

ios - 有没有办法从 CGAffineTransform 制作 NSAffineTransform?

转载 作者:行者123 更新时间:2023-11-29 13:06:06 25 4
gpt4 key购买 nike

我正在尝试将 iOS 代码转换为 OSX 代码,但在图形移植方面遇到了一些困难。

在 iOS 下我有这个:

NSRect rect = NSMakeRect(centerX.doubleValue - width.doubleValue / 2, 
centerY.doubleValue - height.doubleValue / 2,
width.doubleValue, height.doubleValue);

UIBezierPath * path = nil;

switch (self.shape)
{
case HSTargetShapeInvisible:
path = [UIBezierPath bezierPath];
break;
case HSTargetShapeOval:
path = [UIBezierPath bezierPathWithOvalInRect:rect];
break;
case HSTargetShapeRectangle:
path = [UIBezierPath bezierPathWithRect:rect];
break;
default:
break;
}

CGAffineTransform translate = CGAffineTransformMakeTranslation(-1 * centerX.doubleValue,
-1 * centerY.doubleValue);
[path applyTransform:translate];

CGAffineTransform rotate = CGAffineTransformMakeRotation(rotation.doubleValue / 180 * M_PI);
[path applyTransform:rotate];

translate = CGAffineTransformMakeTranslation(centerX.doubleValue, centerY.doubleValue);
[path applyTransform:translate];

这完美地工作......然后我为 OSX 用这种方式重写了它:

NSRect rect = NSMakeRect(centerX.doubleValue - width.doubleValue / 2,
centerY.doubleValue - height.doubleValue / 2,
width.doubleValue, height.doubleValue);

NSBezierPath * path = nil;

switch (self.shape)
{
case HSTargetShapeInvisible:
path = [NSBezierPath bezierPath];
break;
case HSTargetShapeOval:
path = [NSBezierPath bezierPathWithOvalInRect:rect];
break;
case HSTargetShapeRectangle:
path = [NSBezierPath bezierPathWithRect:rect];
break;
default:
break;
}

NSAffineTransform *rot = [NSAffineTransform transform];
NSAffineTransform *pos = [NSAffineTransform transform];

[pos translateXBy:-1*centerX.doubleValue yBy:-1*centerY.doubleValue];

[rot rotateByRadians:rotation.doubleValue / 180 * M_PI];

[pos translateXBy:centerX.doubleValue
yBy:centerY.doubleValue ];

[rot appendTransform:pos];
[path transformUsingAffineTransform:rot];

这不是以同样的方式工作。有谁知道问题出在哪里?!

非常感谢任何形式的帮助!

最佳答案

您的原始代码使用三个转换,您现在尝试使用两个转换。回到三个(使用不同的变量来明确):

NSAffineTransform *pos1 = [NSAffineTransform transform];   
[pos1 translateXBy:-1*centerX.doubleValue yBy:-1*centerY.doubleValue];
[path transformUsingAffineTransform:pos1];

NSAffineTransform *rot = [NSAffineTransform transform];
[rot rotateByRadians:rotation.doubleValue / 180 * M_PI];
[path transformUsingAffineTransform:rot];

NSAffineTransform *pos2 = [NSAffineTransform transform];
[pos2 translateXBy:centerX.doubleValue yBy:centerY.doubleValue];
[path transformUsingAffineTransform:pos2];

如果您只想使用一个transformUsingAffineTransform:,您可以删除上面的三个用法并添加代码:

[pos1 appendTransform:rot];
[pos1 appendTransform:pos2];
[path transformUsingAffineTransform:pos1];

你甚至可以用一个来做,但要注意顺序——从最后到第一:

NSAffineTransform *compound = [NSAffineTransform transform];
[compound translateXBy:centerX.doubleValue yBy:centerY.doubleValue];
[compound rotateByRadians:rotation.doubleValue / 180 * M_PI];
[compound translateXBy:-1*centerX.doubleValue yBy:-1*centerY.doubleValue];
[path transformUsingAffineTransform:compound];

HTH

关于ios - 有没有办法从 CGAffineTransform 制作 NSAffineTransform?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18598516/

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