SpherePackingScenarioGenerator
|
00001 #ifndef VectorField_H 00002 #define VectorField_H 00003 00004 #include <iostream> 00005 #include <fstream> 00006 #include "algorithms/ls/Vector.h" 00007 00012 namespace algorithms{ 00013 namespace ls{ 00014 00015 template<int V, int D, typename T=double> 00016 class VectorField { 00017 00018 public: 00019 int elements; 00020 00021 private: 00022 Vector<V, T>* f; 00023 Vector<D, int> size; // number of grid points for each dimension 00024 Vector<D, int> offset; 00025 00026 public: 00030 VectorField(); 00034 VectorField(const Vector<D, int>&); 00038 ~VectorField(); 00042 Vector<D, int> get_size() const; 00046 void set_size(const Vector<D, int>&); 00050 Vector<V, T>& get(const Vector<D, int>&); 00054 void read(std::ifstream&); 00058 void write(std::ofstream&) const; 00062 static void swap(VectorField<V, D, T>&, VectorField<V, D, T>&); 00063 }; 00064 00065 00066 template<int V, int D, typename T> 00067 VectorField<V, D, T>::VectorField() 00068 : f(0), elements(0) 00069 { 00070 } 00071 00072 00073 template<int V, int D, typename T> 00074 VectorField<V, D, T>::VectorField(const Vector<D, int>& s)inline 00075 : f(0) 00076 { 00077 set_size(s); 00078 } 00079 00080 00081 template <int V, int D, typename T> 00082 VectorField<V, D, T>::~VectorField() 00083 { 00084 if(f != 0) 00085 delete[] f; 00086 } 00087 00088 template<int V, int D, typename T> 00089 inline Vector<D, int> VectorField<V, D, T>::get_size() const 00090 { 00091 return size; 00092 } 00093 00094 template<int V, int D, typename T> 00095 void VectorField<V, D, T>::set_size(const Vector<D, int>& s) 00096 { 00097 if(f != 0) 00098 delete[] f; 00099 00100 size = s; 00101 00102 elements = 1; 00103 for(int i=0; i<D; i++) { 00104 offset[i] = elements; 00105 elements *= size.x[i]; 00106 } 00107 00108 f = new Vector<V, T>[elements]; 00109 } 00110 00111 template<int V, int D, typename T> 00112 inline Vector<V, T>& VectorField<V, D, T>::get(const Vector<D, int>& pos) 00113 { 00114 int p=0; 00115 for(int i=0; i<D; i++) 00116 p += pos.x[i]*offset[i]; 00117 00118 return f[p]; 00119 } 00120 00121 00122 template<int V, int D, typename T> 00123 void VectorField<V, D, T>::read(std::ifstream& in) 00124 { 00125 in.read((char*)f, elements*sizeof(T)*V); 00126 } 00127 00128 00129 template<int V, int D, typename T> 00130 void VectorField<V, D, T>::write(std::ofstream& out) const 00131 { 00132 out.write((const char*)f, elements*sizeof(T)*V); 00133 } 00134 00135 template<int V, int D, typename T> 00136 void VectorField<V, D, T>::swap(VectorField<V, D, T>& v1, 00137 VectorField<V, D, T>& v2) 00138 { 00139 Vector<V, T>* f; 00140 00141 f = v1.f; 00142 v1.f = v2.f; 00143 v2.f = f; 00144 } 00145 00146 }/* close namespace ls */ 00147 }/* close namespace algorithms */ 00148 #endif