如何确定 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
。)我需要找到 sx
,M
应用于 C
的水平比例,以及 sy
,应用于 [=] 的垂直比例12=] 来自 M
.
我可以通过对 M
执行奇异值分解来测量 s1
和 s2
。 (我使用的算法基于 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]'的长度,即第一列。
设M
是一个可逆的2x2矩阵。令 C
为以 (0,0) 为中心的半径为 1 的圆。设 E
为长半轴 s1
和短半轴 s2
的椭圆 M*C
。 (然后 s1 >= s2
。)我需要找到 sx
,M
应用于 C
的水平比例,以及 sy
,应用于 [=] 的垂直比例12=] 来自 M
.
我可以通过对 M
执行奇异值分解来测量 s1
和 s2
。 (我使用的算法基于 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]'的长度,即第一列。