0

Android アプリに次のようなメソッドがあります。

//get point after rotation
public static PointF getRotatedPoint(PointF pt,PointF center, float degrees)
{
    double angleInRadians = degrees * (Math.PI / 180);
    pt.x = (float) (Math.cos(angleInRadians) * (pt.x-center.x) - Math.sin(angleInRadians) * (pt.y-center.y) + center.x);
    pt.y = (float) (Math.sin(angleInRadians) * (pt.x-center.x) + Math.cos(angleInRadians) * (pt.y-center.y) + center.y);
    return pt;
}

45度回転させた長方形があります。回転した長方形の任意の点に触れると、長方形が回転していない場合に点の座標を取得したいタッチ点が得られます。したがって、度数の引数に -45 を渡します。これが私がそれを呼び出す方法です:

getRotatedPoint(touchedPoint, centerOfRectangle,-45);

回転する前に四角形にポイントを描画すると、回転した四角形に触れた位置に近い結果が得られますが、かなり大きな違いがあります。

これが私の問題を説明するための写真です: 説明

これは私の数学の問題かもしれないと思うので、どんな答えでも大歓迎です。

4

1 に答える 1

2

計算で初期値と最終値を混合しています。再割り当てpt.x:

pt.x = (float) (Math.cos(angleInRadians) * (pt.x-center.x) - Math.sin(angleInRadians) * (pt.y-center.y) + center.x);

これはすぐには問題になりません。しかし、 の計算は、回転された値ではなく、の元の値にpt.y依存します。pt.x

pt.y = (float) (Math.sin(angleInRadians) * (pt.x-center.x) + Math.cos(angleInRadians) * (pt.y-center.y) + center.y);

したがって、いくつかの一時変数を使用して初期値を保持します。

public static PointF getRotatedPoint(PointF pt,PointF center, float degrees)
{
    double x0 = pt.x;
    double y0 = pt.y;
    double angleInRadians = degrees * (Math.PI / 180);
    pt.x = (float) (Math.cos(angleInRadians) * (x0-center.x) - Math.sin(angleInRadians) * (y0-center.y) + center.x);
    pt.y = (float) (Math.sin(angleInRadians) * (x0-center.x) + Math.cos(angleInRadians) * (y0-center.y) + center.y);
    return pt;
}
于 2013-10-18T17:37:15.457 に答える