gpt4 book ai didi

objective-c - 使用或不使用 NSAffineTransform 旋转 NSImage

转载 作者:行者123 更新时间:2023-12-03 16:30:20 26 4
gpt4 key购买 nike

我在 NSView 的子类上绘制了一个 NSImage。在上一个问题中,我被帮助将它画在左上角。现在,我希望能够旋转图像。我有一个按钮可以增加旋转变​​量 %4,然后将其乘以 -90 来找到旋转角度。然后,我使用 NSAffineTransform 旋转图像,并将其平移回屏幕上。然而,它似乎并没有按照我期望的方式工作。我有两个问题。

1) 当我旋转时,图像中不在前一帧的区域中的部分会被正确绘制。然而,之前的药水却依然是原来的图像。这意味着经过几次旋转后,原始直立图像会出现一个正方形,然后旋转图像下方或左侧会出现一个矩形。

2) 当我重新调整窗口大小时,图像会以原始直立方向(不应如此)重新绘制(应如此)。

基本上,我得出的结论是 NSAffineTransform 并不像我想象的那样工作。还有其他方法可以旋转(和平移)图像吗?谢谢

大代码块:(“WORKS”和“end Works”之间的代码是仅绘制图像的工作代码。它来 self 之前的问题)。

[旧代码已删除,用新代码替换较低的代码]

谢谢

编辑:更多的研究发现,我可以旋转 View ,而不是进行 NSAffineTtransform。这似乎效果更好。但是,我无法让翻译完全正常工作。下面是新代码(删除原始代码以节省空间)

- (void)drawRect:(NSRect)rect
{

//WORKS
NSRect frame;
frame.origin = NSZeroPoint;
frame.size = [image size];
// end works

float deltaX, deltaY, height, width;

// if the rotate button was just clicked, we need to rotate by 90 deg, otherwise not
double rotateDeg = justRot ? -90.0 : 0;

justRot = NO;

// rotate

deltaX = 0;
deltaY = 0;

// translate to account for rotation

height = [image size].height;
width = [image size].width;

switch (rotation)
{
case 0:
NSLog(@"No rotation ");
break;
case 1:
deltaX += width;
break;
case 2:
deltaX += width;
deltaY += height;
break;
case 3:
deltaY += height;
break;
}


NSPoint orig;
if (rotation != 0)
{
orig.x = -100;
orig.y = -100;
}
[self rotateByAngle: rotateDeg];
NSLog(@"orig %f %f", orig.x, orig.y);
// WORKS
[self setFrame: frame];
[image drawAtPoint:NSZeroPoint fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1];
// end works
[self translateOriginToPoint: orig];
}

最佳答案

好吧,对于历史,如果其他人有这个问题,这是我想出的答案:

框架旋转保留在drawRect中,其他所有内容都移动到旋转方法:

-(void)rotate
{
float deltaX, deltaY, height, width;

rotation = (rotation +1) % 4 ;

deltaX = 0;
deltaY = 0;

// translate to account for rotation

height = [image size].height;
width = [image size].width;

switch (rotation)
{
case 0:
NSLog(@"No rotation ");
deltaY -= width;
break;
case 1:
deltaY -= height;
break;
case 2:
deltaX += height-width;
deltaY -= height ;
break;
case 3:
deltaX += height-width;
deltaY -= width;
break;
}

NSPoint orig;
orig.x = deltaX;
orig.y = deltaY;

[self rotateByAngle: 90.0];
[self translateOriginToPoint: orig];

[self setNeedsDisplay:YES];
}

关于objective-c - 使用或不使用 NSAffineTransform 旋转 NSImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1294148/

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