9

数学はもう一度私を打ち負かしました。これはとても簡単な作業ですが、私はそれを成し遂げることができません。

シナリオ:SurfaceViewに丸い画像を描画します。ユーザーが画像の境界線上の点に触れて、それをドラッグし始めます。ユーザーの動きに合わせて円の画像を回転させる必要があります。画像の中心のX、Y座標と、タッチした点の座標という2つの重要な情報があります。

ここに画像の説明を入力してください

画像でわかるように、ユーザーがポイントに触れました。私の描画によると、タッチされたポイントの角度は約40であるはずです。適切に計算できません。

私はこの式を使ってみました:

angle = Math.atan2(touchedY - centerY, touchedX - centerX) * 180 / Math.PI 

角度を計算する方法がわかりません。現在のように、正しく機能せず、値が適切ではありません。たとえば、画像の場合、角度の計算は-50です。

お時間をいただきありがとうございます、どんな情報でも喜んで取られます。

LE:実は、以下のように、私は間違いを犯したと思います。円は次のようになります。

ここに画像の説明を入力してください

4

6 に答える 6

12

問題を再定式化しましょう: 2 つのベクトルの間の角度を見つけたいとします。最初のベクトルは中心点 ( u )からまっすぐ上に向かうアップベクトルで、2 番目のベクトルは中心点からタッチ ポイント ( v ) までのベクトルです。

これで、それを思い出す (またはググる) ことができます

cos a = uv / (|u|*|v|)

ここで、aはベクトルと | の間の角度です。あなた| ベクトルの長さです。アップベクターuは (0, 1) で、長さは 1 です。

ベクトルを手で掛けると x 項がキャンセルされ、次のようになります。

double tx = touch_x - center_x, ty = touch_y - center_y;
double t_length = Math.sqrt(tx*tx + ty*ty);
double a = Math.acos(ty / t_length);

接触点から中心点を引くことによって v ベクトルがどのように得られるかに注意してください。必要に応じて度に変換することを忘れないでください。

于 2011-10-28T08:58:31.597 に答える
6

まず、回転角度は CenterX と CenterY の原点によって決定される必要があります。したがって、(touchedY - centerY、touchedX - centerX) は (centerY - touchedY、centerX - touchedX) である必要があります。

そして、正しい答えは次のようになります。

(int) (Math.toDegrees(Math.atan2(centerY - touchedY, centerX - touchedX)));

それが役に立てば幸い

于 2011-10-28T08:37:21.020 に答える
1

私はそのようなことをするために多くのことを試み、これを実現しました:

画面の中心ではなくビューの位置を取得しますが、それを追加できます:

タッチポイントに基づいて画像ビューを回転:

     iv = (ImageView) findViewById(R.id.soldier); // img view to rotate
     int touch_x = (int) event.getX(); // touch point x
     int touch_y = (int) event.getY(); // touch point y
     int[] location = new int[2];
     iv.getLocationInWindow(location);   // get img location on screen

       float angle = (float) Math.toDegrees(Math.atan2( touch_x - location[0],    touch_y -   location[1]));

        if(angle < 0){
            angle += 360;
        }


     iv.setRotation(-angle);
于 2014-02-13T18:43:42.953 に答える
1

角度には 3 ポイントが必要です。2つしかありません(センターとタッチ)。固定された 3 番目の点 (たとえば、写真の 90 点) を選択し、@vidstige の回答を使用して方程式を見つけます。

于 2011-10-28T09:41:44.067 に答える