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