@@ -208,6 +208,32 @@ function qrotation(rotvec::Vector{T}) where {T <: Real}
208208 Quaternion (one (T), zero (T), zero (T), zero (T), true )
209209end
210210
211+ function qrotation {T<:Real} (dcm:: Matrix{T} )
212+ # See https://arxiv.org/pdf/math/0701759.pdf
213+ a2 = 1 + dcm[1 ,1 ] + dcm[2 ,2 ] + dcm[3 ,3 ]
214+ b2 = 1 + dcm[1 ,1 ] - dcm[2 ,2 ] - dcm[3 ,3 ]
215+ c2 = 1 - dcm[1 ,1 ] + dcm[2 ,2 ] - dcm[3 ,3 ]
216+ d2 = 1 - dcm[1 ,1 ] - dcm[2 ,2 ] + dcm[3 ,3 ]
217+
218+ if a2 >= max (b2, c2, d2)
219+ a = sqrt (a2)/ 2
220+ return Quaternion (a, (dcm[3 ,2 ]- dcm[2 ,3 ])/ 4 a, (dcm[1 ,3 ]- dcm[3 ,1 ])/ 4 a, (dcm[2 ,1 ]- dcm[1 ,2 ])/ 4 a)
221+ elseif b2 >= max (c2, d2)
222+ b = sqrt (b2)/ 2
223+ return Quaternion ((dcm[3 ,2 ]- dcm[2 ,3 ])/ 4 b, b, (dcm[2 ,1 ]+ dcm[1 ,2 ])/ 4 b, (dcm[1 ,3 ]+ dcm[3 ,1 ])/ 4 b)
224+ elseif c2 >= d2
225+ c = sqrt (c2)/ 2
226+ return Quaternion ((dcm[1 ,3 ]- dcm[3 ,1 ])/ 4 c, (dcm[2 ,1 ]+ dcm[1 ,2 ])/ 4 c, c, (dcm[3 ,2 ]+ dcm[2 ,3 ])/ 4 c)
227+ else
228+ d = sqrt (d2)/ 2
229+ return Quaternion ((dcm[2 ,1 ]- dcm[1 ,2 ])/ 4 d, (dcm[1 ,3 ]+ dcm[3 ,1 ])/ 4 d, (dcm[3 ,2 ]+ dcm[2 ,3 ])/ 4 d, d)
230+ end
231+ end
232+
233+ function qrotation {T<:Real} (dcm:: Matrix{T} , qa:: Quaternion )
234+ q = qrotation (dcm)
235+ abs (q- qa) < abs (q+ qa) ? q : - q
236+ end
211237
212238rotationmatrix (q:: Quaternion ) = rotationmatrix_normalized (normalize (q))
213239
0 commit comments