2011-02-24 156 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] ; 
}