|  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:182bool operator!=(const Quaternion &b) constconst 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() constQuaternion(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) constconst Quaternion & operator+=(const T &s)E element_traits Definition Traits.h:73 Generated using doxygen 1.14.0
 
 |