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

这是@Evansgelist 对 Kotlin 用户的回答的更方便的实现:

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 回答