平行移動/スケーリング/回転行列から値を回転させる方法は?
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
ページの下部で説明されているようなもの)を使用してマトリックス値を抽出し、角度を計算することです。
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
。