gpt4 book ai didi

ios - CGAffineTransformMakeRotation 在 180 度(-3.14)后反方向

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

所以,

我正在尝试做一个非常简单的光盘旋转 (2d),根据用户触摸它,就像 DJ 之类的。它正在工作,但有一个问题,在旋转一定量后,它开始向后移动,这个量是在 180 度之后或者我在记录角度时看到的,-3.14 (pi)。

我想知道,我怎样才能实现无限循环,我的意思是,用户可以一直旋转并旋转到任何一边,只需滑动他的手指?还有第二个问题,有什么办法可以加快轮换速度吗?

这是我现在的代码:

#import <UIKit/UIKit.h>

@interface Draggable : UIImageView {
CGPoint firstLoc;
UILabel * fred;
double angle;
}

@property (assign) CGPoint firstLoc;
@property (retain) UILabel * fred;

@end


@implementation Draggable

@synthesize fred, firstLoc;

- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];

angle = 0;
if (self) {
// Initialization code
}
return self;
}
-(void)handleObject:(NSSet *)touches
withEvent:(UIEvent *)event
isLast:(BOOL)lst
{
UITouch *touch =[[[event allTouches] allObjects] lastObject];
CGPoint curLoc = [touch locationInView:self];

float fromAngle = atan2( firstLoc.y-self.center.y,
firstLoc.x-self.center.x );
float toAngle = atan2( curLoc.y-(self.center.y+10),
curLoc.x-(self.center.x+10));
float newAngle = angle + (toAngle - fromAngle);

NSLog(@"%f",newAngle);

CGAffineTransform cgaRotate = CGAffineTransformMakeRotation(newAngle);

self.transform = cgaRotate;

if (lst)
angle = newAngle;
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch =[[[event allTouches] allObjects] lastObject];
firstLoc = [touch locationInView:self];
};


-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
[self handleObject:touches withEvent:event isLast:NO];
};

-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
[self handleObject:touches withEvent:event isLast:YES];
}

@end

在 ViewController 中:

UIImage *tmpImage = [UIImage imageNamed:@"theDisc.png"];
CGRect cellRectangle;
cellRectangle = CGRectMake(-1,self.view.frame.size.height,tmpImage.size.width ,tmpImage.size.height );
dragger = [[Draggable alloc] initWithFrame:cellRectangle];
[dragger setImage:tmpImage];
[dragger setUserInteractionEnabled:YES];

dragger.layer.anchorPoint = CGPointMake(.5,.5);

[self.view addSubview:dragger];

我也愿意接受新的/更清洁的/更正确的方法。

提前致谢。

最佳答案

如果低于 -180 度或高于 180 度,则翻转角度。考虑以下 touchesMoved 实现:

@implementation RotateView

#define DEGREES_TO_RADIANS(angle) ((angle) / 180.0 * M_PI)

CGFloat angleBetweenLinesInDegrees(CGPoint beginLineA, CGPoint endLineA, CGPoint beginLineB, CGPoint endLineB)
{
CGFloat a = endLineA.x - beginLineA.x;
CGFloat b = endLineA.y - beginLineA.y;
CGFloat c = endLineB.x - beginLineB.x;
CGFloat d = endLineB.y - beginLineB.y;

CGFloat atanA = atan2(a, b);
CGFloat atanB = atan2(c, d);

// convert radians to degrees
return (atanA - atanB) * 180 / M_PI;
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
CGPoint curPoint = [[touches anyObject] locationInView:self];
CGPoint prevPoint = [[touches anyObject] previousLocationInView:self];

// calculate rotation angle between two points
CGFloat angle = angleBetweenLinesInDegrees(self.center, prevPoint, self.center, curPoint);

// Flip
if (angle > 180) {
angle -= 360;
} else if (angle < -180) {
angle += 360;
}

self.layer.transform = CATransform3DRotate(self.layer.transform, DEGREES_TO_RADIANS(angle), .0, .0, 1.0);
}

@end

当围绕 View 的外边界拖动时,它会像纺车一样连续旋转。希望对您有所帮助。

关于ios - CGAffineTransformMakeRotation 在 180 度(-3.14)后反方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19612276/

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