差分

ナビゲーションに移動 検索に移動

逆行列

1,500 バイト追加, 2023年12月22日 (金) 05:05
編集の要約なし
たとえば[[バーテックスシェーダー]]で[[ローカル座標系]]から[[ワールド座標系]]に変換してしまった頂点位置を[[ピクセルシェーダー]]で[[ローカル座標系]]に戻したい場合などに使われる。
 
== 3x3行列の場合 ==
:<math>
A^{-1} = \frac{1}{\text{det}(A)} \begin{bmatrix}
(a_{11}a_{22} - a_{12}a_{21}) & (a_{02}a_{21} - a_{01}a_{22}) & (a_{01}a_{12} - a_{02}a_{11}) \\
(a_{12}a_{20} - a_{10}a_{22}) & (a_{00}a_{22} - a_{02}a_{20}) & (a_{02}a_{10} - a_{00}a_{12}) \\
(a_{10}a_{21} - a_{11}a_{20}) & (a_{01}a_{20} - a_{00}a_{21}) & (a_{00}a_{11} - a_{01}a_{10})
\end{bmatrix}
</math>
 
C言語風に実装すると以下のような感じ。
<source lang="c">
bool inverseMatrix(float a[3][3], float inv[3][3]) {
float det = a[0][0] * (a[1][1] * a[2][2] - a[2][1] * a[1][2])
- a[0][1] * (a[1][0] * a[2][2] - a[1][2] * a[2][0])
+ a[0][2] * (a[1][0] * a[2][1] - a[1][1] * a[2][0]);
 
if (det == 0) {
printf("The matrix is singular and cannot be inverted.\n");
return false;
}
 
float invdet = 1 / det;
 
inv[0][0] = (a[1][1] * a[2][2] - a[2][1] * a[1][2]) * invdet;
inv[0][1] = -(a[0][1] * a[2][2] - a[0][2] * a[2][1]) * invdet;
inv[0][2] = (a[0][1] * a[1][2] - a[0][2] * a[1][1]) * invdet;
inv[1][0] = -(a[1][0] * a[2][2] - a[1][2] * a[2][0]) * invdet;
inv[1][1] = (a[0][0] * a[2][2] - a[0][2] * a[2][0]) * invdet;
inv[1][2] = -(a[0][0] * a[1][2] - a[1][0] * a[0][2]) * invdet;
inv[2][0] = (a[1][0] * a[2][1] - a[2][0] * a[1][1]) * invdet;
inv[2][1] = -(a[0][0] * a[2][1] - a[2][0] * a[0][1]) * invdet;
inv[2][2] = (a[0][0] * a[1][1] - a[1][0] * a[0][1]) * invdet;
return true;
}
</source>
== 関連項目 ==
 
* [[行列]]
* [[逆行列]]
* [[転置行列]]

案内メニュー