如何从平移/缩放/旋转矩阵中旋转值?
Matrix matrix = new Matrix();
matrix.postScale(...);
matrix.postTranslate(...);
matrix.postRotate(...);
...
现在我不知道它是rotate
是什么,但我需要得到它。怎么做?
答案 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));
答案 1 :(得分:2)
不幸的是,没有定义的方法来提取旋转信息(我假设你正在寻找度数)。您可以做的最好的事情是使用getValues
提取矩阵值并使用转换公式(类似于this页面底部讨论的内容)来尝试找出角度。
答案 2 :(得分:0)
答案 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
。