MC_v3d_vector.hpp

Go to the documentation of this file.
00001 /*
00002 **    TP ETI3 CPE Lyon
00003 **    Copyright (C) 2008 Damien Rohmer
00004 **
00005 **    This program is free software: you can redistribute it and/or modify
00006 **    it under the terms of the GNU General Public License as published by
00007 **    the Free Software Foundation, either version 3 of the License, or
00008 **    (at your option) any later version.
00009 **
00010 **   This program is distributed in the hope that it will be useful,
00011 **    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012 **    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013 **    GNU General Public License for more details.
00014 **
00015 **    You should have received a copy of the GNU General Public License
00016 **    along with this program.  If not, see <http://www.gnu.org/licenses/>.
00017 */
00018 
00019 
00020 #ifndef MC_V3D_VECTOR_HPP_
00021 #define MC_V3D_VECTOR_HPP_
00022 
00023 
00024 
00025 #include <MC_v3d.hpp>
00026 #include <vector>
00027 #include <set>
00028 #include <map>
00029 #include <list>
00030 #include <algorithm>
00031 
00032 
00033 
00034 namespace mesh_conv
00035 {
00036     class MC_double_vector;
00037     class MC_int_vector;
00038     class MC_matrix;
00039     class MC_connectivity_index;
00040     class MC_mesh_index_vector;
00041 
00043 
00044     class MC_v3d_vector
00045     {
00046 
00047 
00048     protected:
00049 
00051         std::vector <MC_v3d> v;
00052 
00053 
00054     public:
00055 
00056 
00057         //*********************************************//
00058         //*********************************************//
00059         // CONSTRUCTORS
00060         //*********************************************//
00061         //*********************************************//
00062 
00064         MC_v3d_vector();
00066         MC_v3d_vector(const int& new_size);
00068         MC_v3d_vector(const MC_v3d& v0);
00070         MC_v3d_vector(const MC_v3d& v0,const MC_v3d& v1);
00072         MC_v3d_vector(const MC_v3d& v0,const MC_v3d& v1,const MC_v3d& v2);
00074         MC_v3d_vector(const MC_v3d& v0,const MC_v3d& v1,const MC_v3d& v2,const MC_v3d& v3);
00076         MC_v3d_vector(const MC_v3d& v0,const MC_v3d& v1,const MC_v3d& v2,const MC_v3d& v3,const MC_v3d& v4);
00078         MC_v3d_vector(const MC_v3d_vector& vec);
00080         MC_v3d_vector(const std::vector <MC_v3d>& vec);
00082         MC_v3d_vector(const std::set <MC_v3d,MC_v3d_less> set);
00084         MC_v3d_vector(const std::map <MC_v3d,int,MC_v3d_less> map);
00086         MC_v3d_vector(const MC_double_vector& x_vector,const MC_double_vector& y_vector,const MC_double_vector& z_vector);
00087 
00088         //************************************************//
00089         //************************************************//
00090         //Asserts
00091         //************************************************//
00092         //************************************************//
00093 
00097         void assert_bounds(const int& u) const;
00098 
00099 
00100 
00101         //*********************************************//
00102         //*********************************************//
00103         // Attribute
00104         //*********************************************//
00105         //*********************************************//
00106 
00108         int size() const;
00109 
00110         //*********************************************//
00111         //*********************************************//
00112         // Manipulate
00113         //*********************************************//
00114         //*********************************************//
00115 
00117         void clear();
00118 
00122         MC_v3d_vector& resize(const int& new_size);
00123 
00127         MC_v3d_vector& add(const MC_v3d& x);
00131         MC_v3d_vector& add(const MC_v3d_vector& v_x);
00135         friend MC_v3d_vector operator<<(const MC_v3d_vector& vec,const MC_v3d& value);
00139         friend MC_v3d_vector operator<<(const MC_v3d_vector& vec,const MC_v3d_vector& value);
00140 
00141 
00145         MC_v3d_vector& set(const int& k_index,const MC_v3d& x);
00151         MC_v3d_vector& set(const mesh_conv::MC_int_vector& k_index,const MC_v3d_vector& x);
00152 
00153 
00155         const MC_v3d& first() const;
00157         MC_v3d& first();
00158 
00160         const MC_v3d& last() const;
00162         MC_v3d& last();
00163 
00165         MC_double_vector component(const int& k_dim) const;
00166 
00167 
00168 
00169         //************************************************//
00170         //************************************************//
00171         //Initialize value
00172         //************************************************//
00173         //************************************************//
00174 
00175 
00177         static MC_v3d_vector zeros(const int& new_size);
00178 
00179 
00180         //************************************************//
00181         //************************************************//
00182         //Math operator
00183         //************************************************//
00184         //************************************************//
00185 
00186 
00187 
00188 
00192         MC_v3d_vector operator-() const;
00193 
00194 
00198         friend MC_v3d_vector operator+(const MC_v3d_vector& vec,const MC_v3d& to_add);
00202         friend MC_v3d_vector operator+(const MC_v3d& to_add,const MC_v3d_vector& vec);
00206         friend MC_v3d_vector operator-(const MC_v3d_vector& vec,const MC_v3d& to_sub);
00207 
00211         friend MC_v3d_vector operator*(const MC_v3d_vector& vec,const double& to_mult);
00215         friend MC_v3d_vector operator*(const double& to_mult,const MC_v3d_vector& vec);
00219         friend MC_v3d_vector operator/(const MC_v3d_vector& vec,const double& to_subdiv);
00220 
00221 
00222 
00228         friend MC_v3d_vector operator+(const MC_v3d_vector& vec,const MC_v3d_vector& to_add);
00234         friend MC_v3d_vector operator-(const MC_v3d_vector& vec,const MC_v3d_vector& to_sub);
00235 
00236 
00237 
00239         MC_v3d_vector& operator+=(const MC_v3d& to_add);
00241         MC_v3d_vector& operator-=(const MC_v3d& to_sub);
00243         MC_v3d_vector& operator*=(const double& to_mult);
00245         MC_v3d_vector& operator/=(const double& to_subdiv);
00246 
00251         MC_v3d_vector& operator+=(const MC_v3d_vector& to_add);
00256         MC_v3d_vector& operator-=(const MC_v3d_vector& to_sub);
00257 
00259         static MC_v3d sum(const MC_v3d_vector& vec);
00260 
00262         friend MC_v3d_vector operator*(const MC_matrix& M,const MC_v3d_vector& vec);
00264         MC_v3d_vector& operator*=(const MC_matrix& M);
00265 
00268         friend MC_v3d_vector operator*(const MC_double_vector w,const MC_v3d_vector& vec);
00271         friend MC_v3d_vector operator*(const MC_v3d_vector& vec,const MC_double_vector& w);
00274         MC_v3d_vector& operator*=(const MC_double_vector& w);
00275 
00277         static MC_double_vector norm(const MC_v3d_vector& vec);
00278 
00280         MC_v3d_vector normalized() const;
00281 
00283         MC_v3d_vector& scale(const MC_v3d_vector& s);
00284 
00288         std::pair <MC_v3d_vector,double> scaled_to_unit() const;
00289 
00291         MC_v3d barycenter() const;
00292 
00293 
00294         //*********************************************//
00295         //*********************************************//
00296         // get Operators
00297         //*********************************************//
00298         //*********************************************//
00299 
00301         const MC_v3d& operator()(const int& k_index) const ;
00303         MC_v3d& operator()(const int& k_index) ;
00305         const MC_v3d& operator[](const int& k_index) const ;
00307         MC_v3d& operator[](const int& k_index) ;
00308         
00310         MC_v3d_vector operator()(const MC_int_vector& index) const; 
00312         MC_v3d_vector operator[](const MC_int_vector& index) const;
00313 
00315         const MC_v3d* pointer() const;
00319         MC_v3d* pointer_unprotected();
00320 
00321         //************************************************//
00322         //************************************************//
00323         //change type
00324         //************************************************//
00325         //************************************************//
00326 
00328         std::map <MC_v3d,int,MC_v3d_less> to_map() const;
00330         std::set <MC_v3d,MC_v3d_less> to_set() const;
00332         std::list <MC_v3d> to_list() const;
00333 
00334 
00335         //*********************************************//
00336         //*********************************************//
00337         // Bounding box
00338         //*********************************************//
00339         //*********************************************//
00340 
00345         std::pair <MC_v3d,MC_v3d> bounding_box_elements() const;
00346 
00348         MC_v3d bounding_box_length() const;
00349 
00350 
00351         //*********************************************//
00352         //*********************************************//
00353         // INPUT OUTPUT
00354         //*********************************************//
00355         //*********************************************//
00356 
00358         friend std::ostream& operator<<(std::ostream& output,const MC_v3d_vector& in);
00359 
00361         std::ostream& export_stream(std::ostream& output) const;
00363         MC_v3d_vector& read_stream(std::istream& input);
00364 
00365     private:
00366     };
00367 
00368 
00370     class MC_v3d_vector_less
00371     {
00372     public:
00373         bool operator()(const MC_v3d_vector& v0,const MC_v3d_vector& v1) const
00374         {
00375             MC_v3d_less L;
00376             if(v0.size()<v1.size())
00377                 return true;
00378             else if(v0.size()>v1.size())
00379                 return false;
00380             else //equal size compare by values
00381             {
00382                 int N=v0.size();
00383                 for(int k=0;k<N;++k)
00384                 {
00385                     if(L(v0[k],v1[k])==true)
00386                         return true;
00387                     else if(L(v1[k],v0[k])==true)
00388                         return false;
00389                 }
00390                 //complete equality
00391                 return false;
00392             }
00393         }
00394     };
00395 
00396 }
00397 
00398 #endif

Generated on Wed Nov 11 17:13:42 2009 by  doxygen 1.6.1