2012-03-23 9 views
0

UIViewを回転させるための数学を計算しようとしていますが、特定の面は画面上を移動するとき常に指に「追従」します。iOS指をたどるように回転する砲塔/大砲の数学

私はほとんどそこにいますが、私は何年も三角法を学んでいないので、何をすべきか正確には分かりません。ここに私が持っているものがあります:

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint touchPoint = [touch locationInView:self.view]; 

    int dy = cannon.frame.origin.y - touchPoint.y; 
    int dx = cannon.frame.origin.x - touchPoint.x; 

    cannon.transform = CGAffineTransformMakeRotation(atan2(dy,dx) - 135); 
} 
+1

これが役立つ場合、Ray Wenderlichは回転するタレットについて書いています。それはcocos2dにありますが、普通のobjcにはかなりの類似点があると思います。http://www.raywenderlich.com/692/rotating-turrets – CodaFi

+0

あなたの現在のソリューションは、どうしたいのですか? 'atan2'はインスタントトラッキングのために使うのが最も簡単ですので、あなたはそれが分かっているように見えます。 – Tommy

+0

それはそれほど正しいことではありません。それはいくつかのスポットでspazzes、私は一定のX値を保持し、Yを上下に移動すると、それはあまりUIViewを移動します。 – Derek

答えて

1

まず、お時間を割いていただいた皆様、ありがとうございます!

私はしばらくの間、それを周りに演奏し、唯一の問題は、私が代わりにfloatのS dydxためint Sを使用したことだったようです。また、度をラジアンに変換するためのすばらしく素早い「方法」も見つけました。

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

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint touchPoint = [touch locationInView:self.view]; 

    float dy = cannon.frame.origin.y - touchPoint.y; 
    float dx = cannon.frame.origin.x - touchPoint.x; 

    cannon.transform = CGAffineTransformMakeRotation(atan2(dy,dx) - DEGREES_TO_RADIANS(90)); 
} 
0

私はあなたのタレットの頭の見出しが正しいと仮定します。

あなたのPI定数は3.14(ラジアンで角度)

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint touchPoint = [touch locationInView:self.view]; 

    int dy = cannon.frame.origin.y - touchPoint.y; 
    int dx = cannon.frame.origin.x - touchPoint.x; 

    float a = atan(abs(dy)/abs(dx)); 
    if(dx>0 && dy<0) a += PI/2; 
    if(dx<0 && dy<0) a += PI; 
    if(dx<0 && dy>0) a += 3*PI/2; 

    cannon.transform = CGAffineTransformMakeRotation(a); 
} 

である私は(なしの場合)、それはより最適化することができると思いますが、私は一瞬のために自分自身をテストすることはできません。それは動作しますか?

+0

これはちょうど 'atan2'をうまく再実装していません。 –

+0

どのように! atan2を知らなかった...クール – Martin

0

atan2CGAffineTransformMakeRotationは、度ではなくラジアンで動作するため、定数135が間違っている可能性があります。 135度のラジアン相当はπ・3/4です。

しかし、これ以外にも、あなたのコードはうまく見えます - これはあなたが記述する奇妙な動作ではなく、一定のオフセットを引き起こすはずです。 cannon.frame.origin自体が変換の影響を受けていないと確信していますか?

関連する問題