如何检查矩阵是否对齐? 因此,我的意思是任何旋转90度(包括0)的倍数。
现在,我想出的最好的办法是创建两个轴对齐的点,将它们传递通过矩阵,然后查看这些点是否仍是轴对齐的。
// return 0, 90, 180 or 270 if axis aligned, else returns -1
static public int test_matrix_axis_aligned(Mat3 m) {
int rot = -1;
Vec2 a = create_vec2(0, 0);
Vec2 b = create_vec2(1000, 0);
a = mult(m, a);
b = mult(m, b);
// TODO rounding with a certain threshold?
a.x = round(a.x);
a.y = round(a.y);
b.x = round(b.x);
b.y = round(b.y);
boolean axis_aligned = a.x == b.x || a.y == b.y;
if (axis_aligned) {
//float angle = atan2(b.y - a.y, b.x - a.x);
//println("a: "+angle);
//if (angle < 0) angle += PI; // wrong for 270
//rot = (int) round(degrees(angle));
float dx = a.x - b.x;
float dy = a.y - b.y;
if (dx < 0 && dy == 0) {
rot = 0;
} else if (dx == 0 && dy < 0) {
rot = 90;
} else if (dx > 0 && dy == 0) {
rot = 180;
} else if (dx == 0 && dy > 0) {
rot = 270;
}
}
return rot;
}
但是我想知道它是否可以更有效地完成。
答案 0 :(得分:0)
如果仿射矩阵的成分可能由平移,缩放和旋转组成,则可以将旋转角度提取为
fi = atan2(-m12, m11)
其中m11
和m12
是第一行和第二行的secons组成部分(请注意,矩阵可能是左撇子和右撇子,因此您可能需要使用列而不是行)
答案 1 :(得分:0)
如果您想要一个可以在任意数量的维度上运行的例程,则可以执行两个步骤。
1
或-1
。如果要允许缩放“旋转”,则此数字可以是任何非零值。1
。如果要在“旋转”中允许反射,则还应允许行列式-1
。如果要允许缩放“旋转”,则允许使用任何非零的行列式。正如评论所言,如果您知道矩阵只有两个维度,那么您的工作就容易得多。