Home
Install
Use
Develop
Support
News
Credits
hosted by
|
15#include "complex_promote.h"
25enum QBasis { Hermitian, Unitary };
28template< typename T, QBasis B = Unitary>
35 Quaternion ( const T& a=0.0, const T& b=0.0, const T& c=0.0, const T& d=0.0)
36 : s0(a), s1(b), s2(c), s3(d) { }
39 template< typename U> Quaternion (T s, const Vector<3, U>& v)
40 : s0(s), s1(v[0]), s2(v[1]), s3(v[2]) { }
44 : s0(s.s0), s1(s.s1), s2(s.s2), s3(s.s3) { }
49 { s0=T(s.s0); s1=T(s.s1); s2=T(s.s2); s3=T(s.s3); return * this; }
53 { s0+=s; return * this; }
57 { s0-=s; return * this; }
61 { s0*=a; s1*=a; s2*=a; s3*=a; return * this; }
65 { T d(1.0); d/=a; s0*=d; s1*=d; s2*=d; s3*=d; return * this; }
70 { s0+=s.s0; s1+=s.s1; s2+=s.s2; s3+=s.s3; return * this; }
75 { s0-=s.s0; s1-=s.s1; s2-=s.s2; s3-=s.s3; return * this; }
80 { * this = * this * s; return * this; }
84 { return s0==b.s0 && s1==b.s1 && s2==b.s2 && s3==b.s3; }
88 { return s0==scalar && s1==0 && s2==0 && s3==0; }
96 { s.s0=-s.s0; s.s1=-s.s1; s.s2=-s.s2; s.s3=-s.s3; return s; }
100 { T* val = &s0; return val[n]; }
114 { Vector<3,T> ret; ret[0]=s1; ret[1]=s2; ret[2]=s3; return ret; }
118 void set_vector ( const Vector<3,U>& v) { s1=v[0]; s2=v[1]; s3=v[2]; }
124 unsigned size () const { return 4; }
129template< typename T, QBasis B, typename U>
139template< typename T, QBasis B, typename U>
150template< typename T, QBasis B, typename U>
161template< typename T, QBasis B, typename U>
171template< typename T, QBasis B, typename U>
181template< typename T, QBasis B>
192 static inline unsigned ndim () { return 4; }
193 static inline T& element (Quaternion<T,B>& t, unsigned idim)
195 static inline const T& element ( const Quaternion<T,B>& t, unsigned idim)
200template< typename T, typename U>
203operator * ( const Quaternion<std::complex<T>,Hermitian>& a,
204 const Quaternion<std::complex<U>,Hermitian>& b)
206 typedef std::complex<typename PromoteTraits<T,U>::promote_type> R;
208 ( a.s0*b.s0 + a.s1*b.s1 + a.s2*b.s2 + a.s3*b.s3 ,
209 a.s0*b.s1 + a.s1*b.s0 + ci(a.s2*b.s3) - ci(a.s3*b.s2) ,
210 a.s0*b.s2 - ci(a.s1*b.s3) + a.s2*b.s0 + ci(a.s3*b.s1) ,
211 a.s0*b.s3 + ci(a.s1*b.s2) - ci(a.s2*b.s1) + a.s3*b.s0 );
215template< typename T, typename U>
220 (a.s0*b.s0 - a.s1*b.s1 - a.s2*b.s2 - a.s3*b.s3,
221 a.s0*b.s1 + a.s1*b.s0 - a.s2*b.s3 + a.s3*b.s2,
222 a.s0*b.s2 + a.s1*b.s3 + a.s2*b.s0 - a.s3*b.s1,
223 a.s0*b.s3 - a.s1*b.s2 + a.s2*b.s1 + a.s3*b.s0);
228template< typename T, QBasis B>
232 (j.s0.real(), j.s1.real(), j.s2.real(), j.s3.real());
236template< typename T, QBasis B>
240 (j.s0.imag(), j.s1.imag(), j.s2.imag(), j.s3.imag());
248 (myconj(j.s0), myconj(j.s1), myconj(j.s2), -myconj(j.s3));
256 (myconj(j.s0), -myconj(j.s1), -myconj(j.s2), myconj(j.s3));
265 (myconj(j.s0), myconj(j.s1), myconj(j.s2), myconj(j.s3));
274 (myconj(j.s0), -myconj(j.s1), -myconj(j.s2), -myconj(j.s3));
279template< typename T, QBasis B>
282 T d (-1.0); d/=det(j);
290{ return j.s0*j.s0 - j.s1*j.s1 - j.s2*j.s2 - j.s3*j.s3; }
295{ return j.s0*j.s0 + j.s1*j.s1 + j.s2*j.s2 + j.s3*j.s3; }
298template< typename T, QBasis B>
300{ return 2.0 * j.s0; }
303template< typename T, QBasis B>
304T norm ( const Quaternion<std::complex<T>,B>& j)
305{ return 2.0 * (norm(j.s0) + norm(j.s1) + norm(j.s2) + norm(j.s3)); }
308template< typename T, QBasis B>
310{ return 2.0 * (j.s0*j.s0 + j.s1*j.s1 + j.s2*j.s2 + j.s3*j.s3); }
312template< typename T, QBasis B>
314{ return sqrt (norm(j)); }
317template< typename T, QBasis B>
320 T root_det = sqrt( det(h) );
321 T scalar = sqrt( 0.5 * (h.s0 + root_det) );
373 if (q.s1 < 0 && q.s0 != 0)
375 T m = 1.0 / sqrt( 2.0*p*(p-q.s1) );
380 T m = 1.0 / sqrt( 2.0*p*(p+q.s1) );
389 return ostr << "[h:" << j.s0 << ","<< j.s1 << ","<< j.s2 << ","<< j.s3 << "]";
396 return ostr << "[u:" << j.s0 << ","<< j.s1 << ","<< j.s2 << ","<< j.s3 << "]";
static const Quaternion & identity() Definition Quaternion.h:182
bool operator!=(const Quaternion &b) const
const Quaternion & operator=(const Quaternion< U, B > &s)
friend const friend Quaternion operator-(Quaternion s)
const Quaternion & operator*=(const T &a)
const Quaternion & operator/=(const T &a)
Vector< 3, T > get_vector() const
Quaternion(const T &a=0.0, const T &b=0.0, const T &c=0.0, const T &d=0.0)
const Quaternion & operator-=(const T &s)
void set_vector(const Vector< 3, U > &v)
bool operator==(const Quaternion &b) const
const Quaternion & operator+=(const T &s)
E element_traits Definition Traits.h:73
Generated using doxygen 1.14.0
|