2012-02-13 20 views
4

私はUIRotationGestureRecognizerの結果として三角形を回転させるのに苦労しています。あなたが私のアプローチを見渡して提案をすることができれば、私は大いに感謝しています。三角形を回転させる方法は?

私はジェスチャレコグナイザオブジェクトに回転について質問し、ドキュメントにはラジアンで返されます。

私の戦略は、各頂点を、三角形の中心と頂点の間にある円上の点として考えることでした。回転のラジアンを使用してその円周上の新しい点を見つけました。私はこれが有効なアプローチであることは完全にはわかりませんが、少なくとも試してみたかったのです。視覚的に私はそれが働いていたかどうかを知っています。

- (CGPoint)rotateVertex:(CGPoint)vertex byRadians:(float)radians 
{ 
    float deltaX = center.x - vertex.x; 
    float deltaY = center.y - vertex.y; 
    float currentAngle = atanf(deltaX/deltaY); 
    float newAngle = currentAngle + radians; 
    float newX = cosf(newAngle) + vertex.x; 
    float newY = sinf(newAngle) + vertex.y; 
    return CGPointMake(newX, newY); 
} 

実行すると、初めにわずかな回転がありますが、その後、私は私の指を回転させ続けると頂点がちょうど遠く離れた中心点からの取得を開始:

ここで私はその試みで作成されたコードです私はここで何か混乱していることを示しています。

私はCGContextRotateCTMが私にとって何ができるのかを見ましたが、最終的には回転後の頂点が何であるかを知る必要があるため、グラフィックスコンテキストを回転させるだけでは、

また、hereというテクニックも試しましたが、2番目の頂点の周りに三角形が反転してしまいました。これは奇妙に見えますが、pとqは2番目の頂点のx座標とy座標で動作します。

ありがとうございました!

解決済み:ここに修正された機能があります。あなたが三角形の中心を計算したと仮定します。私はCentroidsに関するWikipediaの記事で説明されている1/3(x1 + x2 + x3)、1/3(y1 + y2 + y3)の方法を使用しました。

- (CGPoint)rotatePoint:(CGPoint)currentPoint byRadians:(float)radiansOfRotation 
{ 
    float deltaX = currentPoint.x - center.x; 
    float deltaY = currentPoint.y - center.y; 
    float radius = sqrtf(powf(deltaX, 2.0) + powf(deltaY, 2.0)); 
    float currentAngle = atan2f(deltaY, deltaX); 
    float newAngle = currentAngle + radiansOfRotation; 
    float newRun = radius * cosf(newAngle); 
    float newX = center.x + newRun; 
    float newRise = radius * sinf(newAngle); 
    float newY = center.y + newRise; 
    return CGPointMake(newX, newY); 
} 

最初のコードリストが機能しなかった理由は、atan2への引数が逆になったことに関連しています。また、デルタ値の正しい計算が逆転された。

答えて

4

あなたは円の半径で掛けることを忘れています。また、Y軸はUIKit座標系をポイントしているので、ラジアンを加算する代わりに減算し、最後にy座標を打ち消す必要があります。そしてatan2を使う必要があるのは、-pi/2からpi/2の範囲の出力だけです。

float currentAngle = atan2f(deltaY, deltaX); 
float newAngle = currentAngle - radians; 
float radious = sqrtf(powf(deltaX, 2.0) + powf(deltaY, 2.0)); 
float newX = radius * cosf(newAngle) + vertex.x; 
float newY = -1.0 * radius * sinf(newAngle) + vertex.y; 
+0

ありがとう、ゆうじ、それを指摘してください。私はそれをコードに統合しました。それはその一部を修正しますが、今度は新しい頂点座標が邪魔になりません。私はロギングメッセージをたくさん入れて、入力を再計算できるかどうかを調べるために数学を逆順に処理します。私はまだそこにいませんが、私はあなたが手伝ったと思います! – tobinjim

+0

私の喜び。私は別の問題を発見しました - 上の新しい編集バージョンを試してみてください。 – yuji

+0

あなたは私より速く動いています!私は自分のミスがどこで行われているかを見るために声明文を書きます。私はYが間違った方向に向いているという意識を構築していましたが、まだそこにはいなかったのです。 iOS上のY軸がデカルト座標とは異なり、下に行くほど大きくなるため、符号を変更していましたか? – tobinjim

0

答えは元の質問に埋め込まれています。適切な礼拝堂について恥ずかしがり屋;-)

関連する問題