如何确定2x2矩阵在x轴上的刻度是否比y轴更大?

时间:2017-07-01 17:36:35

标签: opengl matrix glsl scale ellipse

M成为可逆的2x2矩阵。设C为以(0,0)为中心的半径1的圆。设E为半长轴M*C和半短轴s1的椭圆s2。 (然后s1 >= s2。)我需要找到sxC应用于M的水平比例,sy,应用于{C的垂直比例1}} M

我可以通过在s1上执行奇异值分解来衡量s2M。 (我使用的算法基于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);
}

1 个答案:

答案 0 :(得分:0)

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

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

设M = U * s * V(SVD分解)

V * C将是C,因为V只是一个旋转(旋转圆圈不会改变它)。

所以,我们离开了U * s。这种转变是角度保持。 U * s将首先缩放圆(因此它变成椭圆形,具有半轴s * [1 0]&#39;和s * [0 1]&#39;),然后旋转它。因此,最终的半轴是U * s * [1 0]&#39;和U * s * [0 1]&#39;,这是U * s的列。

注意:对于一般矩阵,没有这样的问题&#34;它如何在水平方向上缩放&#34;。所有人都可以说原始x轴发生了多大的比例(我的意思是,转换后原来的x轴多长时间),这只是M * [1 0]&#39;的长度,第一列的长度。