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_vec2f 4 #ifndef tools_vec2f 5 #define tools_vec2f 5 #define tools_vec2f 6 6 7 #include "vec2" 7 #include "vec2" 8 #include "../S_STRING" 8 #include "../S_STRING" 9 #include <cmath> 9 #include <cmath> 10 10 11 namespace tools { 11 namespace tools { 12 12 13 class vec2f : public vec2<float> { 13 class vec2f : public vec2<float> { 14 typedef vec2<float> parent; 14 typedef vec2<float> parent; 15 public: 15 public: 16 TOOLS_SCLASS(tools::vec2f) //for stype() 16 TOOLS_SCLASS(tools::vec2f) //for stype() 17 public: 17 public: 18 vec2f():parent(){} 18 vec2f():parent(){} 19 vec2f(const float a_vec[2]):parent(a_vec){} 19 vec2f(const float a_vec[2]):parent(a_vec){} 20 vec2f(float a0,float a1):parent(a0,a1){} 20 vec2f(float a0,float a1):parent(a0,a1){} 21 virtual ~vec2f() {} 21 virtual ~vec2f() {} 22 public: 22 public: 23 vec2f(const vec2f& a_from): parent(a_from){} 23 vec2f(const vec2f& a_from): parent(a_from){} 24 vec2f& operator=(const vec2f& a_from){ 24 vec2f& operator=(const vec2f& a_from){ 25 parent::operator=(a_from); 25 parent::operator=(a_from); 26 return *this; 26 return *this; 27 } 27 } 28 28 29 vec2f(const parent& a_from):parent(a_from){} 29 vec2f(const parent& a_from):parent(a_from){} 30 30 31 public: //operators 31 public: //operators 32 vec2f operator*(float a_v) const { 32 vec2f operator*(float a_v) const { 33 return vec2f(m_data[0]*a_v, 33 return vec2f(m_data[0]*a_v, 34 m_data[1]*a_v); 34 m_data[1]*a_v); 35 } 35 } 36 vec2f operator+(const vec2f& a_v) const { 36 vec2f operator+(const vec2f& a_v) const { 37 return vec2f(m_data[0]+a_v.m_data[0], 37 return vec2f(m_data[0]+a_v.m_data[0], 38 m_data[1]+a_v.m_data[1]); 38 m_data[1]+a_v.m_data[1]); 39 } 39 } 40 vec2f operator-(const vec2f& a_v) const { 40 vec2f operator-(const vec2f& a_v) const { 41 return vec2f(m_data[0]-a_v.m_data[0], 41 return vec2f(m_data[0]-a_v.m_data[0], 42 m_data[1]-a_v.m_data[1]); 42 m_data[1]-a_v.m_data[1]); 43 } 43 } 44 vec2f& operator+=(const vec2f& a_v) { 44 vec2f& operator+=(const vec2f& a_v) { 45 m_data[0] += a_v.m_data[0]; 45 m_data[0] += a_v.m_data[0]; 46 m_data[1] += a_v.m_data[1]; 46 m_data[1] += a_v.m_data[1]; 47 return *this; 47 return *this; 48 } 48 } 49 vec2f& operator*=(float a_v) { 49 vec2f& operator*=(float a_v) { 50 m_data[0] *= a_v; 50 m_data[0] *= a_v; 51 m_data[1] *= a_v; 51 m_data[1] *= a_v; 52 return *this; 52 return *this; 53 } 53 } 54 vec2f operator-() const { 54 vec2f operator-() const { 55 return vec2f(-m_data[0],-m_data[1]); 55 return vec2f(-m_data[0],-m_data[1]); 56 } 56 } 57 public: 57 public: 58 #define TOOLS_VEC2F_MORE_PREC 58 #define TOOLS_VEC2F_MORE_PREC 59 #ifdef TOOLS_VEC2F_MORE_PREC 59 #ifdef TOOLS_VEC2F_MORE_PREC 60 float length() const { 60 float length() const { 61 return float(::sqrt(m_data[0]*m_data[0]+m_ 61 return float(::sqrt(m_data[0]*m_data[0]+m_data[1]*m_data[1])); 62 } 62 } 63 float normalize() { 63 float normalize() { 64 float norme = length(); 64 float norme = length(); 65 if(!norme) return 0; 65 if(!norme) return 0; 66 divide(norme); 66 divide(norme); 67 return norme; 67 return norme; 68 } 68 } 69 #else 69 #else 70 float length() const {return parent::length( 70 float length() const {return parent::length(::sqrtf);} 71 float normalize() {return parent::normalize( 71 float normalize() {return parent::normalize(::sqrtf);} 72 #endif 72 #endif 73 public: //iv2sg 73 public: //iv2sg 74 bool equals(const vec2f& a_v,const float a_e 74 bool equals(const vec2f& a_v,const float a_epsil) const { 75 //if(a_epsil<0.0f)) 75 //if(a_epsil<0.0f)) 76 float d0 = m_data[0]-a_v.m_data[0]; 76 float d0 = m_data[0]-a_v.m_data[0]; 77 float d1 = m_data[1]-a_v.m_data[1]; 77 float d1 = m_data[1]-a_v.m_data[1]; 78 return ((d0*d0+d1*d1)<=a_epsil); 78 return ((d0*d0+d1*d1)<=a_epsil); 79 } 79 } 80 void negate() { 80 void negate() { 81 m_data[0] = -m_data[0]; 81 m_data[0] = -m_data[0]; 82 m_data[1] = -m_data[1]; 82 m_data[1] = -m_data[1]; 83 } 83 } 84 84 85 private:static void check_instantiation() {vec 85 private:static void check_instantiation() {vec2f v(0,0);v.set_value(1,1);} 86 }; 86 }; 87 87 88 inline vec2f operator*(float a_f,const vec2f& 88 inline vec2f operator*(float a_f,const vec2f& a_v) { 89 vec2f res(a_v); 89 vec2f res(a_v); 90 res *= a_f; 90 res *= a_f; 91 return res; 91 return res; 92 } 92 } 93 93 94 } 94 } 95 95 96 #include <vector> 96 #include <vector> 97 97 98 namespace tools { 98 namespace tools { 99 99 100 #ifndef SWIG 100 #ifndef SWIG 101 //for sf, mf : 101 //for sf, mf : 102 inline bool set_from_vec(vec2f& a_v,const std: 102 inline bool set_from_vec(vec2f& a_v,const std::vector<float>& a_sv) { 103 if(a_sv.size()!=2) return false; 103 if(a_sv.size()!=2) return false; 104 a_v[0] = a_sv[0]; 104 a_v[0] = a_sv[0]; 105 a_v[1] = a_sv[1]; 105 a_v[1] = a_sv[1]; 106 return true; 106 return true; 107 } 107 } 108 #endif 108 #endif 109 109 110 } 110 } 111 111 112 #endif 112 #endif