Как определить, масштабируется ли матрица 2x2 по оси x больше, чем по оси y?
Позволять M
быть обратимой матрицей 2х2. Позволять C
быть кругом радиуса 1 с центром в (0,0). Позволять E
быть эллипсом M*C
с большой полуосью s1
и малая ось s2
, (Затем s1 >= s2
.) Мне нужно найти sx
горизонтальный масштаб применяется к C
от M
, а также sy
вертикальная шкала применяется к C
от M
,
Я могу измерить s1
а также s2
выполняя разложение по сингулярным числам на M
, (Алгоритм, который я использую, основан на ответе Педро Гимено на алгоритм Robust для SVD 2x2. s1
это большее единственное значение и s2
это меньшее единственное значение.) Я знаю, что <sx,sy>
равно либо <s1,s2>
или же <s2,s1>
, но я не знаю, какой из них; однако, если я могу определить, что sx > sy
(путем реализации scalesMoreInXAxis(mat2)
функция ниже), то я могу сделать вывод, что <sx,sy> = <s1,s2>
(и наоборот, если sx <= sy
).
Вот мой код GLSL:
bool scalesMoreInXAxis(mat2 m){
// TODO: implement
return false;
}
void main(){
float a = M[0][0];
float b = M[1][0];
float c = M[0][1];
float d = M[1][1];
float e = (a + d) / 2.0;
float f = (a - d) / 2.0;
float g = (c + b) / 2.0;
float h = (c - b) / 2.0;
float q = sqrt(e*e + h*h);
float r = sqrt(f*f + g*g);
float s1 = q + r; // Semi major axis
float s2 = abs(q - r); // Semi minor axis
vec2 s = scalesMoreInXAxis(M) ? vec2(s1,s2) : vec2 (s2,s1);
}
1 ответ
Чего ты хочешь достичь? Я не понимаю, что вы имеете в виду под осью полу-х.
Тем не менее, вот что я думаю, как вы можете рассчитать полуоси:
пусть M=U*s*V (разложение SVD)
V * C будет C, поскольку V - это просто вращение (вращение круга не изменит его).
Итак, мы ушли с U*s. Это преобразование сохраняет угол. U*s сначала масштабирует круг (таким образом, он становится эллипсом с полуосями s*[1 0]'и s*[0 1]'), а затем вращает его. Итак, последние полуоси - это U*s*[1 0]'и U*s*[0 1]', которые являются столбцами U*s.
Примечание: для общей матрицы нет такого вопроса, как "как она масштабируется в горизонтальном направлении". Все, что можно сказать, это то, сколько масштаба произошло для исходной оси X (я имею в виду, как долго станете исходной осью X после преобразования), которая является просто длиной M*[1 0]', длиной первый столбец