0

私はタッチで円の矢印を回転させる必要があるiPadアプリに取り組んでいます。しかし、私はその中で問題に直面しています。問題は、画像を回転させる角度の計算にあります。

ここで確認できます。大きな赤い矢印の画像を円の周りに回転させる必要があります。タッチポイントの角度を取得する方法を教えてください。現在、次のコードを使用しています。ネットのどこかで見つけました。しかし、タッチした場所に矢印が回転しませんでした。

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *oneTouch = [touches anyObject];
    CGPoint currentPoint = [oneTouch locationInView:imgCompass];    

    double current_angle = [self wheelAngleFromPoint:currentPoint]; 
    imgNeedle.transform = CGAffineTransformMakeRotation( current_angle );
}

- (double) wheelAngleFromPoint:(CGPoint)location
{
    double retAngle;

    // subtract center of wheel 

    location.x -= (self.imgNeedle.bounds.size.width ) / 2.0;
    location.y = (self.imgNeedle.bounds.size.height )  / 2.0 - location.y;


    // normalize vector
    double vector_length = sqrt(location.x*location.x + location.y*location.y);

    location.x = location.x/vector_length;
    location.y = location.y/vector_length;

    retAngle = acos(location.y);

    float offset = 0.28;
    //if (location.x)
    //  offset = 0.28;
    retAngle += offset;


    if (location.x<0)
    {
        retAngle = -retAngle;
    }

    return retAngle;
}

誰でも正しい角度の計算を手伝ってくれますか?

ありがとう

4

1 に答える 1

0

問題は次のとおりです。

location.x -= (self.imgNeedle.bounds.size.width ) / 2.0;
location.y = (self.imgNeedle.bounds.size.height )  / 2.0 - location.y;

location.x計算中および計算後の値は、 (またはホイール?) の中心からタッチ ポイントまでlocation.yのベクトルを表す必要があります。imgNeedle代わりにこれを試してください:

location.x = location.x - self.imgNeedle.center.x;
location.y = self.imgNeedle.center.y - location.y;

プロパティを設定しているためimgNeedle.transform、フレームは無効になりますが、中心は問題ないことに注意してください:) - imgNeedle は画像の中心を中心に回転します。

私が明示的に述べたことに注意してくださいlocation.x - self.imgNeedle.center.x 何が起こっているのかを理解するには、2 つの点の差 (それらの間のベクトル) を計算する必要があります。数学では、(0, 0) が原点で、x 軸は右が正、y 軸は上が正であることを理解しておく必要があります。ただし、デバイスの画面では、使用している座標系 (表示座標) (0, 0) は左上にあり、x 軸は右に向かって正になりますが、y 軸は下に向かって正になります (画面座標をさまざまな方法でマッピングできるため、これは常に正しいとは限りません)。これが、location.y の減算が location.x の減算とは逆である理由です。これは、(角度を数学的に計算するという点で) 画面が垂直に「反転」することを考慮したものです。数学では、正の回転は反時計回りの回転を表し、1 つの軸のフリップはこれを隠して、正の角度が時計回りの回転を意味するように見せることができます (2 つの負が正になるように)。回転とベクトルでは、これらすべてを考慮に入れる必要があります。ただし、目的のためには非常に単純であるため、すべての数学に頭を悩ませるのではなく、試行錯誤を使用してコードを操作することを好む場合があります。方向のいずれかを反転する必要がある場合があります (減算) または回転方向を変更する (行う 回転とベクトルをいじる場合は、これらすべてを考慮に入れる必要があります。ただし、目的のためには非常に単純であるため、すべての数学に頭を悩ませるのではなく、試行錯誤を使用してコードを操作することを好む場合があります。方向のいずれかを反転する必要がある場合があります (減算) または回転方向を変更する (行う 回転とベクトルをいじる場合は、これらすべてを考慮に入れる必要があります。ただし、目的のためには非常に単純であるため、すべての数学に頭を悩ませるのではなく、試行錯誤を使用してコードを操作することを好む場合があります。方向のいずれかを反転する必要がある場合があります (減算) または回転方向を変更する (行う2*M_PI - retAngle例えば)。

于 2010-10-28T15:25:24.227 に答える