2011-02-24 159 views
2

我想旋转图像的中心点周围。我面临的问题是我需要获得角度来计算触摸移动事件(我不想使用多点触摸)。我现在用下面的代码在饼图中计算旋转角度

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ 

NSArray *allTouches = [touches allObjects]; 
gestureStartPoint = gestureMovedPoint;//i am getting the gestureStartPoint on touch began event 

gestureMovedPoint = [[allTouches objectAtIndex:0] locationInView:[self superview]]; 

NSLog(@"gestureMovedPoint = %@",NSStringFromCGPoint(gestureMovedPoint)); 

}当前

CGFloat previousAngle = [self angleBetweenPoints:gestureStartPoint second11:gestureMovedPoint]; // atan2(gestureMovedPoint.y - gestureStartPoint.y, gestureMovedPoint.x - gestureStartPoint.x) * 180/M_PI; 
CGFloat currentAngle =atan2(self.transform.b, self.transform.a);//atan2(gestureMovedPoint.y - gestureStartPoint.y,gestureMovedPoint.x - gestureStartPoint.x) * 180/M_PI; 



CGFloat angleToRotate = currentAngle - previousAngle; 



float xpoint = (((atan2((gestureMovedPoint.x - gestureStartPoint.x) , (gestureMovedPoint.y - gestureStartPoint.y)))*180)/M_PI); 

    CGAffineTransform transform = CGAffineTransformMakeRotation(angleToRotate-100); 



self.transform = transform; 

请帮我看看,因为我坚持在这里,需要是有死线很快完成该应用程序的解决方案。 在此先感谢

回答

2

很高兴我记得triginometry


-(void)degreesToRotateObjectWithPosition:(CGPoint)objPos andTouchPoint:(CGPoint)touchPoint{ 

    float dX = touchPoint.x-objPos.x;  // distance along X 
    float dY = touchPoint.y-objPos.y;  // distance along Y 
    float radians = atan2(dY, dX);   // tan = opp/adj 

    //Now we have to convert radians to degrees: 
    float degrees = radians*M_PI/360; 

    return degrees; 
} 

一旦你有你的好方法,只是这样做的触摸事件的方法。 (我忘了叫什么了...)

CGAffineTransform current = view.transform; 

[view setTransform:CGAffineTransformRotate(current,
[self degreesTorotateObjectWithPosition:view.frame.origin
andTouchPoint:[touch locationInView:parentView]] //Note: parentView = The view that your object to rotate is sitting in.

这是几乎所有你会need.The数学是正确的代码,但我不知道的东西的setTransform。我在学校用浏览器写这篇文章。你应该能够从这里弄清楚。

祝你好运,

奥罗拉奎拉

+0

嗨Aurum, 感谢您的回复,这很有帮助。但它仍然不能正确计算角度。 也不会在反时钟方向旋转。 谢谢。 – 2011-02-24 11:17:17

+0

如果您想要逆时针转动,只需将角度设置为负值...您不确定您的意思是否为其他评论。它似乎为我工作。 – 2011-02-24 11:19:25

+0

其他点我的意思是它应该与我的触摸旋转,但它不会以这种方式旋转。我认为计算中有些问题。以下是我的代码。 在答案部分请反过来咯thanx – 2011-02-24 13:16:10

0

不得不这样想。但我宁愿旋转两次触摸视图。它会更简单。

+0

看看这有助于http://www.iphonedevsdk.com/forum/iphone-sdk-development/41964-drag-rotate-image-only-rotating-one -way.html – 2011-02-24 10:12:32

0

我也挣扎了一下该如何进入触摸驱动的旋转,更是这样,因为我想我使用的代码100%的了解。所以我结束了,经过多次失败的尝试,这一点:

- (CGFloat) pointToAngleFromCenter: (CGPoint) point { 
    // transform point to a self.center'ed origin based coordinate system 
    point.x = point.x - self.center.x ; 
    // ditto for y, but compensate for y going downwards to y going upwards 
    point.y = self.center.y - point.y ; 
    return ::atan2(point.y, point.x) ; 
} 

如果任何人有一个更好的名字了这种方法,我所有的耳朵。

它所做的是在父视图坐标中需要一个点,并将其相对于视图中心(在父视图坐标中)重新映射,然后计算该重新映射点与轴之间的角度[0X] 。为此,它将y归一化为正常的数学坐标(y在其值增加时上升,而不是下降),因此为self.center.y - point.y,而不是相反。

最后,在touchesMoved:

- (void) touchesMoved: (NSSet *) touches withEvent: (UIEvent *) event { 
    UITouch * touch = [touches anyObject] ; 

    CGFloat currA = [self pointToAngleFromCenter:[touch locationInView:self.superview]] ; 
    CGFloat prevA = [self pointToAngleFromCenter:[touch previousLocationInView:self.superview]] ; 
    // the current value of the rotation angle 
    CGFloat tranA = ::atan2(self.transform.b, self.transform.a) ; 
    // the angle difference between last touch and the current touch 
    CGFloat diffA = currA - prevA ; 
    // the new angle resulting from applying the difference 
    CGFloat angle = tranA - diffA ; 

    CGAffineTransform t = ::CGAffineTransformMakeRotation(angle) ; 

    self.transform = t ; 
    [self setNeedsDisplay] ; 
}