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