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