如何确定 2x2 矩阵在 x 轴上的缩放比例是否大于 y 轴?

How to determine if a 2x2 matrix scales more in the x axis than the y axis?

M是一个可逆的2x2矩阵。令 C 为以 (0,0) 为中心的半径为 1 的圆。设 E 为长半轴 s1 和短半轴 s2 的椭圆 M*C。 (然后 s1 >= s2。)我需要找到 sxM 应用于 C 的水平比例,以及 sy,应用于 [=] 的垂直比例12=] 来自 M.

我可以通过对 M 执行奇异值分解来测量 s1s2。 (我使用的算法基于 Pedro Gimeno 对 Robust algorithm for 2x2 SVD 的回答。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);
}

你想达到什么目的?我不明白你说的半x轴是什么意思

但是,我的想法是,如何计算半轴:

设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的列。

注:对于一般矩阵,没有"how does it scale in the horizontal direction"这道题。只能说原来的x轴发生了多少尺度(我的意思是变换后变成原来的x轴多长时间),也就是M*[1 0]'的长度,即第一列。