差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
| articles:rotation [2021/11/15 23:52] – [直交行列から回転軸,角度表現を求める] Takashi Suehiro | articles:rotation [2022/03/04 08:56] (現在) – [プログラムと練習問題] Takashi Suehiro | ||
|---|---|---|---|
| 行 710: | 行 710: | ||
| ここの説明では$ n_x $から解いたが実際には上3つの式を解いて | ここの説明では$ n_x $から解いたが実際には上3つの式を解いて | ||
| 一番絶対値の大きい成分から残りを計算すると精度的にも良い値が得られる. | 一番絶対値の大きい成分から残りを計算すると精度的にも良い値が得られる. | ||
| + | |||
| + | |||
| + | ほとんどの場合,上記の解き方で問題はないが,$\theta = \pi$の場合は計算誤差などの関係で微妙な問題が発生する可能性がある. | ||
| + | そこでその場合について別途解いておくことにする.式(9)に代入して, | ||
| + | $$ | ||
| + | \left( \begin{array}{cc} | ||
| + | -1 + 2 n_x^2 & | ||
| + | 2 n_x n_y & | ||
| + | 2 n_z n_x \\ | ||
| + | |||
| + | 2 n_x n_y & | ||
| + | -1 + 2 n_y^2 & | ||
| + | 2 n_y n_z \\ | ||
| + | |||
| + | 2 n_z n_x & | ||
| + | 2 n_y n_z & | ||
| + | -1 + 2 n_z^2 | ||
| + | \end{array} \right) | ||
| + | $$ | ||
| + | 係数を比較すると | ||
| + | $$ | ||
| + | -1 + 2 n_x^2 = a_{xx} | ||
| + | $$ | ||
| + | $$ | ||
| + | -1 + 2 n_y^2 = a_{yy} | ||
| + | $$ | ||
| + | $$ | ||
| + | -1 + 2 n_z^2 = a_{zz} | ||
| + | $$ | ||
| + | $$ | ||
| + | 2 n_x n_y = a_{yx} = a_{xy} | ||
| + | $$ | ||
| + | $$ | ||
| + | 2 n_y n_z = a_{zy} = a_{yz} | ||
| + | $$ | ||
| + | $$ | ||
| + | 2 n_z n_x = a_{xz} = a_{zx} | ||
| + | $$ | ||
| + | よって | ||
| + | $$ | ||
| + | n_x = \pm \sqrt{{1 + a_{xx}} \over 2} | ||
| + | $$ | ||
| + | $ n_x \ne 0 $の場合,$\pi$回転はどちらに回しても同じなので正負はどちらを選んでもよい. | ||
| + | 他の成分はこれと整合を取るため以下のように計算する. | ||
| + | $$ | ||
| + | n_y = a_{yx}/ 2 n_x | ||
| + | $$ | ||
| + | $$ | ||
| + | n_z = a_{xz}/ 2 n_x | ||
| + | $$ | ||
| + | $ n_x = 0 $の場合は他の成分から解けば良い. | ||
| + | |||
| + | ここの説明では$ n_x $から解いたが実際には$a_{xx}$,$a_{yy}$,$a_{zz}$を比較して, | ||
| + | 一番大きい成分から残りを計算するとゼロ割が問題にならないし精度的にも良い値が得られる. | ||
| --> | --> | ||
| 行 751: | 行 805: | ||
| $$ | $$ | ||
| - | しかし,$\mathrm{sin}\, | + | 実際には$\mathrm{sin}\, |
| $\theta=0$に近い場合は,回転角度も小さく回転軸の誤差は問題にならない. | $\theta=0$に近い場合は,回転角度も小さく回転軸の誤差は問題にならない. | ||
| 行 787: | 行 841: | ||
| この式(11)と式(12)の切り替えは,$\theta=\pi/ | この式(11)と式(12)の切り替えは,$\theta=\pi/ | ||
| - | (([[articles: | + | (([[articles: |
| + | さらに言えば四元数を求めてからロドリゲスを計算するほうが良いのかもしれない.)). | ||
| + | |||
| + | この計算方法は$\theta$が大きいときにゼロ割が発生しないので安定して計算ができるが, 実際のプログラムでは計算誤差の影響で平方根の中の値が極めて小さいときに負になることがあるという点に注意を払う必要がある. | ||
| + | |||
| + | ===== プログラムと練習問題 ===== | ||
| + | |||
| + | [[articles: | ||
| + | |||
| + | [[articles: | ||