讓M
是一個可逆2x2矩陣。讓C
爲以(0,0)爲中心的半徑1的圓。令E
爲橢圓M*C
,其中半長軸s1
和半短軸s2
。 (然後s1 >= s2
。)我需要找到sx
,水平範圍應用於C
,M
和sy
,垂直範圍應用於C
,M
。如何確定一個2x2矩陣在x軸上的縮放比y軸多嗎?
我可以通過在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);
}
你的's1'和's2'似乎是'M'的SVD分解的奇異值,'s1> s2'。因此,'s1'和's2'是'E'的長軸和短軸的長度(可以這麼說)。但是,我不明白你的'sx'和'sy'是什麼。謹慎解釋? –
'sx'是'M'應用於'C'的水平刻度,'sy'是'M'應用於'C'的垂直刻度。我知道'sx'等於's1'或's2',但我不知道哪一個;然而,如果我可以確定'sx> sy',(通過實現scalesMoreInXAxis函數),那麼我可以得出結論:'sx = s1'和'sy = s2'。 –
對於任意矩陣來說,'sx'和'sy'的這種定義沒有什麼意義。假設「M」旋轉了90度,然後將「x」軸縮放了2倍。這相當於首先將「y」軸縮放2,然後旋轉90度。這些將是兩個不同但等價的「SVD」分解。如果你在'E'的主軸和副軸之後,那麼它們的方向是'U'的列,並且相應的比例因子是'M = U * S * V'中'S'的對角線元素。 –