Как определить, масштабируется ли матрица 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]', длиной первый столбец

Другие вопросы по тегам