从android中的矩阵中获取旋转值?

时间:2012-09-04 04:33:22

标签: android matrix rotation

如何从平移/缩放/旋转矩阵中旋转值?

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

现在我不知道它是rotate是什么,但我需要得到它。怎么做?

5 个答案:

答案 0 :(得分:20)

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/

答案 1 :(得分:2)

不幸的是,没有定义的方法来提取旋转信息(我假设你正在寻找度数)。您可以做的最好的事情是使用getValues提取矩阵值并使用转换公式(类似于this页面底部讨论的内容)来尝试找出角度。

答案 2 :(得分:0)

我无法在此处输入方程式,因此我对如何解决您的问题进行了描述。在这里:

enter image description here

答案 3 :(得分:0)

除了以前的答案,这是您需要的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()

答案 4 :(得分: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