5

平行移動/スケーリング/回転行列から値を回転させる方法は?

Matrix matrix = new Matrix();
matrix.postScale(...);
matrix.postTranslate(...);
matrix.postRotate(...);
...

今はそれが何だったのかわかりませんrotateが、入手する必要があります。これを行う方法?

4

5 に答える 5

27
float[] v = new float[9];
matrix.getValues(v);
// translation is simple
float tx = v[Matrix.MTRANS_X];
float ty = v[Matrix.MTRANS_Y];

// calculate real scale
float scalex = v[Matrix.MSCALE_X];
float skewy = v[Matrix.MSKEW_Y];
float rScale = (float) Math.sqrt(scalex * scalex + skewy * skewy);

// calculate the degree of rotation
float rAngle = Math.round(Math.atan2(v[Matrix.MSKEW_X], v[Matrix.MSCALE_X]) * (180 / Math.PI));

ここから http://judepereira.com/blog/calculate-the-real-scale-factor-and-the-angle-of-rotation-from-an-android-matrix/

于 2015-02-03T20:15:22.747 に答える
6

ここに方程式を入れることができないので、あなたの問題を解決する方法を描きます。ここにあります:

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

于 2018-10-17T04:20:36.833 に答える
3

以前の回答に加えて、必要なKotlin拡張機能があります。この行列の回転角の値を返します

fun Matrix.getRotationAngle() = FloatArray(9)
    .apply { getValues(this) }
    .let { -round(atan2(it[MSKEW_X], it[MSCALE_X]) * (180 / PI)).toFloat() }

マトリックスで呼び出す必要があります。マトリックス値は変更されないことに注意してください。

val angleInDegree = yourMatrix.getRotationAngle()
于 2019-05-10T16:05:25.050 に答える
2

残念ながら、回転情報を抽出するための定義された方法はありません(度数を探していると仮定します)。最善の方法は、変換式(このgetValuesページの下部で説明されているようなもの)を使用してマトリックス値を抽出し、角度を計算することです。

于 2012-09-04T04:38:56.187 に答える
0

Kotlinユーザー向けの@Evansgelistの回答のより便利な実装は次のとおりです。

val Matrix.rotation: Float
    get() {
        return atan2(
            values()[Matrix.MSKEW_X],
            values()[Matrix.MSCALE_X],
        ) * (180f / Math.PI.toFloat())
    }

val Matrix.scale: Float
    get() {
        return sqrt(
        values()[Matrix.MSCALE_X].pow(2) +
            values()[Matrix.MSKEW_Y].pow(2)
        )
    }

val Matrix.translationX: Float
    get() { return values()[Matrix.MTRANS_X] }

val Matrix.translationY: Float
    get() { return values()[Matrix.MTRANS_Y] }

を呼び出すたびにvalues、新しいが割り当てられることに注意してくださいFloatArray

于 2021-04-20T06:54:21.937 に答える