我在旋转踏板时试图旋转自行车车轮。
当我逆时针旋转时,没有问题。
但是当我顺时针旋转约2-3秒时,图像开始逆时针旋转而不是快速旋转。
当我尝试记录angleInRadians值时: 逆时针旋转时,angleInRadians值最多在-0.05到-0.1之间变化。 angleInRadians值在开始时介于0.05到0.1之间,但突然之间值变为-6.1,-6.2之类的东西。请参阅下面的日志。
我改变了图像的锚点。我不确定这是否重要。
抱歉我的英文和格式不好
- (void) viewDidLoad
{
[super viewDidLoad];
self.PedalTurn.layer.anchorPoint = CGPointMake(0.5, 0.6);
}
- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
CGPoint center = CGPointMake(CGRectGetMidX(self.PedalTurn.bounds), CGRectGetMidY(self.PedalTurn.bounds));
CGPoint currentPoint = [touch locationInView:self.PedalTurn];
CGPoint previousPoint = [touch previousLocationInView:self.PedalTurn];
CGFloat angleInRadians = atan2f(currentPoint.y - center.y, currentPoint.x - center.x) - atan2f(previousPoint.y - center.y, previousPoint.x - center.x);
self.PedalTurn.transform = CGAffineTransformRotate(self.PedalTurn.transform, angleInRadians);
}
Angle in radians: 0.110071
Angle in radians: 0.0984247
Angle in radians: 0.107355
Angle in radians: 0.118767
Angle in radians: 0.121201
Angle in radians: 0.112823
Angle in radians: 0.0899732
Angle in radians: 0.0883234
Angle in radians: 0.105448
Angle in radians: 0.0884745
Angle in radians: 0.0983613
Angle in radians: 0.108684
Angle in radians: 0.119307
Angle in radians: 0.108768
Angle in radians: 0.111302
Angle in radians: 0.145414
Angle in radians: -6.14848
Angle in radians: -6.13048
Angle in radians: -6.12109
Angle in radians: -6.14578
Angle in radians: -6.13917
Angle in radians: -6.11675
Angle in radians: -6.13025
Angle in radians: -6.15015
Angle in radians: -6.14989
Angle in radians: -6.15097
Angle in radians: -6.14732
Angle in radians: -6.15547
Angle in radians: -6.136
Angle in radians: -6.13241
答案 0 :(得分:0)
我有两点建议:
atan2f
会在atan2f(+-0, x)
时针对x < 0
这样的来电返回+ pi或-pi,因此您可能遇到currentPoint.y
和{{1}的问题是&#34;等于&#34;到previousPoint.y
但是你在一个案例中获得了center.y
而在另一个案例中获得了+0
,所以你得到的不是-0
-pi - (+ pi)〜-6.28。如果发生这种情况,那么您可能希望特别处理0
和currentPoint.y == center.y
的情况,即使这意味着仅使用文字0.0调用previousPoint.y == center.y
而不是执行算术。
我的另一个建议是,你根本不会迭代地确定变换。为什么要打扰atan2f
并对之前和当前的位置进行算术运算?只需使用当前位置并按照以下方式进行旋转:
CGAffineTransformRotate(self.PedalTurn.transform,…
然后,当你经历多次迭代时,你不必担心你的算术变得不稳定。
答案 1 :(得分:0)
atan2的限制是pi,所以当你达到pi的阈值(水平在圆圈的左侧)时,发生的事情是你的lastTouch在第二象限真的接近180度,你当前的触摸在第三象限真的接近-180度。请阅读atan2 http://en.wikipedia.org/wiki/Atan2。
根据你的角度在里亚人,179.99 - (-179.99)= 359.98,或大约2pi,这是~6.28。因此,当你达到这个阈值时,你真的会增加接近2pi,这是大约6.xxx的来源。