Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/externals/g4tools/include/tools/lina/rotf

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  1 // Copyright (C) 2010, Guy Barrand. All rights reserved.
  2 // See the file tools.license for terms.
  3 
  4 #ifndef tools_rotf
  5 #define tools_rotf
  6 
  7 // rotation done with quaternion.
  8 
  9 #include "qrot"
 10 #include "vec3f"
 11 #include "vec4f"
 12 #include "mat4f"
 13 
 14 namespace tools {
 15 
 16 class rotf : public qrot<vec3f,vec4f> {
 17   typedef qrot<vec3f,vec4f> parent;
 18 private:
 19   rotf(float a_q0,float a_q1,float a_q2,float a_q3):parent(a_q0,a_q1,a_q2,a_q3) {}
 20 public:
 21   rotf():parent() {} //zero rotation around the positive Z axis.
 22   rotf(const vec3f& a_axis,float a_radians):parent(a_axis,a_radians,::sinf,::cosf) {}
 23   rotf(const vec3f& a_from,const vec3f& a_to):parent(a_from,a_to,::sqrtf,::fabsf) {}
 24   virtual ~rotf(){}
 25 public:
 26   rotf(const rotf& a_from):parent(a_from) {}
 27   rotf& operator=(const rotf& a_from){
 28     parent::operator=(a_from);
 29     return *this;
 30   }
 31 public:
 32   rotf& operator*=(const rotf& a_q) {
 33     parent::operator*=(a_q);
 34     return *this;
 35   }
 36   rotf operator*(const rotf& a_r) const {
 37     rotf tmp(*this);
 38     tmp *= a_r;
 39     return tmp;
 40   }
 41 public:
 42   bool set_value(const vec3f& a_from,const vec3f& a_to){
 43     return parent::set_value(a_from,a_to,::sqrtf,::fabsf);
 44   }
 45   bool set_value(const vec3f& a_from,float a_a){
 46     return parent::set_value(a_from,a_a,::sinf,::cosf);
 47   }
 48   bool value(vec3f& a_from,float& a_a) const {
 49     return parent::value(a_from,a_a,::sinf,::acosf); //WARNING acos and not cos
 50   }
 51 
 52   void value(mat4f& a_m) const {parent::value(a_m);}
 53   void set_value(const mat4f& a_m) {parent::set_value(a_m,::sqrtf);}
 54 
 55   //NOTE : don't handle a static object because of mem balance.
 56   //static const rotf& identity() {
 57   //  static const rotf s_v(0,0,0,1);
 58   //  return s_v;
 59   //}
 60 };
 61 
 62 }
 63 
 64 #include <sstream>
 65 
 66 namespace tools {
 67 
 68 inline bool tos(const rotf& a_v,std::string& a_s) {
 69   vec3f axis;
 70   float angle = 0;
 71   if(!a_v.value(axis,angle)) {a_s.clear();return false;}
 72   std::ostringstream strm;
 73   strm << axis[0] << " "
 74        << axis[1] << " "
 75        << axis[2] << " "
 76        << angle;
 77   a_s = strm.str();
 78   return true;
 79 }
 80 
 81 }
 82 
 83 #endif