MC_v3d_vector.cpp

Go to the documentation of this file.
00001 
00002 #include <MC_v3d_vector.hpp>
00003 #include <MC_matrix.hpp>
00004 
00005 #include <MC_double_vector.hpp>
00006 #include <MC_int_vector.hpp>
00007 #include <MC_connectivity_index.hpp>
00008 #include <MC_mesh_index_vector.hpp>
00009 #include <MC_polygon.hpp>
00010 #include <MC_segment.hpp>
00011 
00012 
00013 namespace mesh_conv
00014 {
00015 
00016     MC_v3d_vector::MC_v3d_vector(){}
00017     MC_v3d_vector::MC_v3d_vector(const MC_v3d& v0){v.push_back(v0);}
00018     MC_v3d_vector::MC_v3d_vector(const MC_v3d& v0,const MC_v3d& v1){v.push_back(v0);v.push_back(v1);}
00019     MC_v3d_vector::MC_v3d_vector(const MC_v3d& v0,const MC_v3d& v1,const MC_v3d& v2){v.push_back(v0);v.push_back(v1);v.push_back(v2);}
00020     MC_v3d_vector::MC_v3d_vector(const MC_v3d& v0,const MC_v3d& v1,const MC_v3d& v2,const MC_v3d& v3){v.push_back(v0);v.push_back(v1);v.push_back(v2);v.push_back(v3);}
00021     MC_v3d_vector::MC_v3d_vector(const MC_v3d& v0,const MC_v3d& v1,const MC_v3d& v2,const MC_v3d& v3,const MC_v3d& v4){v.push_back(v0);v.push_back(v1);v.push_back(v2);v.push_back(v3);v.push_back(v4);}
00022     MC_v3d_vector::MC_v3d_vector(const int& new_size){v.resize(new_size);}
00023 
00024 
00025     int mesh_conv::MC_v3d_vector::size() const {return v.size();}
00026     void MC_v3d_vector::assert_bounds(const int& u) const
00027     {
00028         if(u<0 || u>=int(v.size()))
00029         {std::cout<<"Assert mesh_conv::MC_v3d_vector::assert_bounds("<<u<<") failed, because size="<<v.size()<<std::endl;exit(-1);}
00030     }
00031 
00032     const MC_v3d& MC_v3d_vector::operator()(const int& k_index) const {assert_bounds(k_index); return v[k_index];}
00033     MC_v3d& MC_v3d_vector::operator()(const int& k_index) {assert_bounds(k_index); return v[k_index];}
00034     const MC_v3d& MC_v3d_vector::operator[](const int& k_index) const {assert_bounds(k_index); return v[k_index];}
00035     MC_v3d& MC_v3d_vector::operator[](const int& k_index) {assert_bounds(k_index); return v[k_index];}
00036 
00037     MC_v3d_vector::MC_v3d_vector(const MC_v3d_vector& vec)
00038     {
00039         int N=vec.v.size();
00040         for(int k=0;k<N;k++)
00041             v.push_back(vec.v[k]);
00042     }
00043     MC_v3d_vector::MC_v3d_vector(const std::vector <MC_v3d>& vec)
00044     {
00045         int N=vec.size();
00046         for(int k=0;k<N;k++)
00047             v.push_back(vec[k]);
00048     }
00049     MC_v3d_vector::MC_v3d_vector(const std::set <MC_v3d,MC_v3d_less> set)
00050     {
00051         std::set <MC_v3d,mesh_conv::MC_v3d_less> :: const_iterator it;
00052         std::set <MC_v3d,mesh_conv::MC_v3d_less> :: const_iterator it_end=set.end();
00053 
00054         for(it=set.begin();it!=it_end;++it)
00055             v.push_back(*it);
00056     }
00057     MC_v3d_vector::MC_v3d_vector(const std::map <MC_v3d,int,MC_v3d_less> map)
00058     {
00059         std::map <MC_v3d,int,mesh_conv::MC_v3d_less> :: const_iterator it;
00060         std::map <MC_v3d,int,mesh_conv::MC_v3d_less> :: const_iterator it_end=map.end();
00061 
00062         for(it=map.begin();it!=map.end();++it)
00063             set(it->second,it->first);
00064     }
00065     MC_v3d_vector& MC_v3d_vector::add(const MC_v3d& x)
00066     {v.push_back(x);return *this;}
00067     MC_v3d_vector& MC_v3d_vector::add(const MC_v3d_vector& v_x)
00068     {
00069         int N=v_x.size();
00070         for(int k=0;k<N;k++)
00071             v.push_back(v_x[k]);
00072         return *this;
00073     }
00074     MC_v3d_vector& MC_v3d_vector::set(const int& k_index,const MC_v3d& x)
00075     {
00076         if(k_index<0)
00077         {std::cout<<"Error in MC_v3d_vector::set("<<k_index<<","<<x<<"), index must be >0"<<std::endl;exit(-1);}
00078         if(k_index>=size())
00079             v.resize(k_index+1);
00080         v[k_index]=x;
00081         return *this;
00082     }
00083     MC_v3d_vector& MC_v3d_vector::set(const MC_int_vector& k_index,const MC_v3d_vector& x)
00084     {
00085         MC_v3d_vector v_x=x;
00086         if(x.size()!=1 && x.size()!=k_index.size())
00087         {std::cout<<"Error in MC_v3d_vector::set(MC_int_vector,MC_v3d_vector), size are not correct: "<<k_index.size()<<","<<x.size()<<std::endl;exit(-1);}
00088         if(x.size()==1)
00089             v_x=MC_v3d_vector::zeros(k_index.size())+x;
00090 
00091         int N=v_x.size();
00092         for(int k=0;k<N;k++)
00093             set(k_index[k],v_x[k]);
00094         return *this;
00095     }
00096     MC_v3d_vector MC_v3d_vector::zeros(const int& new_size)
00097     {
00098         MC_v3d_vector new_vec;new_vec.resize(new_size);
00099         return new_vec;
00100     }
00101     void MC_v3d_vector::clear()
00102     {v.clear();}
00103     MC_v3d_vector& MC_v3d_vector::resize(const int& new_size)
00104     {
00105         int N=v.size();
00106         if(N==new_size) //same size
00107             return *this;
00108 
00109         if(new_size<0)
00110         {std::cout<<"Error in MC_v3d_vector::resize("<<new_size<<") new size must be >0"<<std::endl;exit(-1);}
00111 
00112         v.resize(new_size);
00113         return *this;
00114     }
00115 
00116     MC_v3d_vector MC_v3d_vector::operator-() const
00117     {
00118         int N=size();
00119         MC_v3d_vector new_vec;new_vec.resize(size());
00120         for(int k=0;k<N;++k)
00121             new_vec[k]=-v[k];
00122         return new_vec;
00123     }
00124 
00125     MC_v3d_vector operator+(const MC_v3d_vector& vec,const MC_v3d& to_add)
00126     {
00127         int N=vec.size();
00128         MC_v3d_vector new_vec;new_vec.resize(N);
00129         for(int k=0;k<N;++k)
00130             new_vec[k]=vec[k]+to_add;
00131         return new_vec;
00132     }
00133     MC_v3d_vector operator+(const MC_v3d& to_add,const MC_v3d_vector& vec){return vec+to_add;}
00134     MC_v3d_vector operator-(const MC_v3d_vector& vec,const MC_v3d& to_sub)
00135     {
00136         int N=vec.size();
00137         MC_v3d_vector new_vec;new_vec.resize(N);
00138         for(int k=0;k<N;++k)
00139             new_vec[k]=vec[k]-to_sub;
00140         return new_vec;
00141     }
00142     MC_v3d_vector operator*(const MC_v3d_vector& vec,const double& to_mult)
00143     {
00144         int N=vec.size();
00145         MC_v3d_vector new_vec;new_vec.resize(N);
00146         for(int k=0;k<N;++k)
00147             new_vec[k]=vec[k]*to_mult;
00148         return new_vec;
00149     }
00150     MC_v3d_vector operator/(const MC_v3d_vector& vec,const double& to_subdiv)
00151     {
00152         double epsilon=0.000001;
00153         if(fabs(to_subdiv)<epsilon)
00154         {std::cout<<"Error in MC_v3d_vector("<<vec<<"/"<<to_subdiv<<", divide by zero"<<std::endl;exit(-1);}
00155 
00156         int N=vec.size();
00157         MC_v3d_vector new_vec;new_vec.resize(N);
00158         for(int k=0;k<N;++k)
00159             new_vec[k]=vec[k]/to_subdiv;
00160         return new_vec;
00161     }
00162     MC_v3d_vector operator+(const MC_v3d_vector& vec,const MC_v3d_vector& to_add)
00163     {
00164         if(to_add.size()==1)
00165             return vec+to_add.first();
00166         else
00167         {
00168             if(vec.size()!=to_add.size())
00169             {std::cout<<"Error in MC_v3d_vector::operator+(MC_v3d_vector,MC_v3d_vector), size are not compatible "<<vec.size()<<";"<<to_add.size()<<std::endl;exit(-1);}
00170 
00171 
00172             int N=vec.size();
00173             MC_v3d_vector new_vec=MC_v3d_vector::zeros(N);
00174             for(int k=0;k<N;++k)
00175                 new_vec[k]=vec[k]+to_add[k];
00176             return new_vec;
00177         }
00178     }
00179     MC_v3d_vector operator-(const MC_v3d_vector& vec,const MC_v3d_vector& to_sub)
00180     {
00181         if(to_sub.size()==1)
00182             return vec-to_sub.first();
00183         else
00184         {
00185             if(vec.size()!=to_sub.size())
00186             {std::cout<<"Error in MC_v3d_vector::operator-(MC_v3d_vector,MC_v3d_vector), size are not compatible "<<vec.size()<<";"<<to_sub.size()<<std::endl;exit(-1);}
00187 
00188 
00189             int N=vec.size();
00190             MC_v3d_vector new_vec=MC_v3d_vector::zeros(N);
00191             for(int k=0;k<N;++k)
00192                 new_vec[k]=vec[k]-to_sub[k];
00193             return new_vec;
00194         }
00195     }
00196     MC_v3d_vector& MC_v3d_vector::operator+=(const MC_v3d& to_add)
00197     {
00198         int N=size();
00199         for(int k=0;k<N;++k)
00200             v[k]+=to_add;
00201         return *this;
00202     }
00203     MC_v3d_vector& MC_v3d_vector::operator-=(const MC_v3d& to_sub)
00204     {
00205         int N=size();
00206         for(int k=0;k<N;++k)
00207             v[k]-=to_sub;
00208         return *this;
00209     }
00210     MC_v3d_vector& MC_v3d_vector::operator*=(const double& to_mult)
00211     {
00212         int N=size();
00213         for(int k=0;k<N;++k)
00214             v[k]*=to_mult;
00215         return *this;
00216     }
00217     MC_v3d_vector& MC_v3d_vector::operator/=(const double& to_subdiv)
00218     {
00219         double epsilon=0.000001;
00220         if(fabs(to_subdiv)<epsilon)
00221         {std::cout<<"Error in MC_v3d_vector/="<<to_subdiv<<", divide by zero"<<std::endl;exit(-1);}
00222 
00223         int N=size();
00224         for(int k=0;k<N;++k)
00225             v[k]/=to_subdiv;
00226         return *this;
00227     }
00228     MC_v3d_vector& MC_v3d_vector::operator+=(const MC_v3d_vector& to_add)
00229     {
00230         if(to_add.size()==1)
00231             return *this+=to_add.first();
00232         else
00233         {
00234             if(size()!=to_add.size())
00235             {std::cout<<"Error in MC_v3d_vector::operator+=(MC_v3d_vector), size are not compatible "<<size()<<";"<<to_add.size()<<std::endl;exit(-1);}
00236 
00237             int N=size();
00238             for(int k=0;k<N;++k)
00239                 v[k]+=to_add[k];
00240             return *this;
00241         }
00242     }
00243     MC_v3d_vector& MC_v3d_vector::operator-=(const MC_v3d_vector& to_sub)
00244     {
00245         if(to_sub.size()==1)
00246             return *this-=to_sub.first();
00247         else
00248         {
00249             if(size()!=to_sub.size())
00250             {std::cout<<"Error in MC_v3d_vector::operator-=(MC_v3d_vector), size are not compatible "<<size()<<";"<<to_sub.size()<<std::endl;exit(-1);}
00251 
00252             int N=size();
00253             for(int k=0;k<N;++k)
00254                 v[k]-=to_sub[k];
00255             return *this;
00256         }
00257     }
00258     std::ostream& operator<<(std::ostream& output,const MC_v3d_vector& in)
00259     {
00260         int N=in.size();
00261         for(int k=0;k<N;++k)
00262             output<<in[k];
00263         return output;
00264     }
00265 
00266     const MC_v3d& MC_v3d_vector::first() const
00267     {
00268         if(size()>0)
00269             return v[0];
00270         else
00271         {
00272             std::cout<<"Error, call MC_v3d_vector::first() with size=0"<<std::endl;exit(-1);
00273             exit(-1);
00274         }
00275     }
00276     MC_v3d& MC_v3d_vector::first()
00277     {
00278         if(size()>0)
00279             return v[0];
00280         else
00281         {
00282             std::cout<<"Error, call MC_v3d_vector::first() with size=0"<<std::endl;exit(-1);
00283             exit(-1);
00284         }
00285     }
00286 
00287     const MC_v3d& MC_v3d_vector::last() const
00288     {
00289         if(size()>0)
00290             return v[size()-1];
00291         else
00292         {
00293             std::cout<<"Error, call MC_v3d_vector::last() with size=0"<<std::endl;exit(-1);
00294         }
00295     }
00296     MC_v3d& MC_v3d_vector::last()
00297     {
00298         if(size()>0)
00299             return v[size()-1];
00300         else
00301         {
00302             std::cout<<"Error, call MC_v3d_vector::last() with size=0"<<std::endl;exit(-1);
00303         }
00304     }
00305     MC_v3d MC_v3d_vector::sum(const MC_v3d_vector& vec)
00306     {
00307         MC_v3d x;
00308         int N=vec.size();
00309         for(int k=0;k<N;++k)
00310             x+=vec[k];
00311         return x;
00312     }
00313 
00314     MC_v3d_vector MC_v3d_vector::operator()(const MC_int_vector& index) const
00315     {
00316 
00317         int N=size();
00318         int N_index=index.size();
00319 
00320         MC_v3d_vector vec=MC_v3d_vector::zeros(N_index);
00321         for(int k_index=0;k_index<N_index;k_index++)
00322         {
00323             int u_index=index[k_index];
00324             if(u_index<0 || u_index>=N)
00325             {std::cout<<"Error in MC_v3d_vector(MC_int_vector index), index["<<k_index<<"]="<<u_index<<", while size of vector is "<<N<<std::endl;exit(-1);}
00326 
00327             vec[k_index]=v[u_index];
00328         }
00329         return vec;
00330     }
00331 
00332     MC_v3d_vector MC_v3d_vector::operator[](const MC_int_vector& index) const
00333     {return (*this)(index);}
00334 
00335     MC_v3d_vector operator<<(const MC_v3d_vector& vec,const MC_v3d& value)
00336     {return MC_v3d_vector(vec).add(value);}
00337 
00338     MC_v3d_vector operator<<(const MC_v3d_vector& vec,const MC_v3d_vector& value)
00339     {return MC_v3d_vector(vec).add(value);}
00340 
00341 
00342     MC_double_vector MC_v3d_vector::component(const int& k_dim) const
00343     {
00344         if(k_dim<0 || k_dim>3)
00345         {std::cout<<"Error in MC_v3d_vector::component("<<k_dim<<"), k_dim must be in [0,2]"<<std::endl;exit(-1);}
00346         int N=size();
00347         MC_double_vector vec=MC_double_vector::zeros(N);
00348         for(int k=0;k<N;k++)
00349             vec[k]=v[k][k_dim];
00350         return vec;
00351     }
00352 
00353     MC_v3d_vector::MC_v3d_vector(const MC_double_vector& x_vector,const MC_double_vector& y_vector,const MC_double_vector& z_vector)
00354     {
00355         // check size
00356         if(x_vector.size()!=y_vector.size() || x_vector.size()!=z_vector.size())
00357         {std::cout<<"Error in MC_v3d_vector::MC_v3d_vector(MC_double_vector("<<x_vector.size()<<"),MC_double_vector("<<y_vector.size()<<"),MC_double_vector("<<z_vector.size()<<")), size are not consistent"<<std::endl;exit(-1);}
00358 
00359         int N=x_vector.size();
00360         v.resize(N);
00361         for(int k=0;k<N;k++)
00362         {
00363             v[k][0]=x_vector[k];
00364             v[k][1]=y_vector[k];
00365             v[k][2]=z_vector[k];
00366         }
00367     }
00368 
00369     MC_v3d_vector operator*(const MC_matrix& M,const MC_v3d_vector& vec)
00370     {
00371         int N=vec.size();
00372         MC_v3d_vector new_vector(N);
00373         for(int k=0;k<N;++k)
00374         {new_vector[k]=M*vec[k];}
00375 
00376         return new_vector;
00377     }
00378     MC_v3d_vector& MC_v3d_vector::operator*=(const MC_matrix& M)
00379     {
00380         int N=size();
00381         for(int k=0;k<N;k++)
00382             v[k]*=M;
00383         return *this;
00384     }
00385 
00386     MC_v3d_vector operator*(const MC_double_vector w,const MC_v3d_vector& vec)
00387     {
00388         int N=vec.size();
00389         MC_v3d_vector res(N);
00390 
00391         if(w.size()==1 && N!=1)
00392         {
00393             double dw=w.first();
00394             for(int k=0;k<N;++k)
00395                 res[k]=dw*vec[k];
00396             return res;
00397         }
00398         else if(w.size()==N)
00399         {
00400             for(int k=0;k<N;++k)
00401                 res[k]=w[k]*vec[k];
00402             return res;
00403         }
00404         else
00405         {std::cout<<"Error in MC_v3d_vector::operator*(MC_double_vector("<<w.size()<<"),MC_v3d_vector("<<vec.size()<<")), size are not compatible"<<std::endl;exit(-1);}
00406     }
00407     MC_v3d_vector operator*(const MC_v3d_vector& vec,const MC_double_vector& w)
00408     {return w*vec;}
00409     MC_v3d_vector& MC_v3d_vector::operator*=(const MC_double_vector& w)
00410     {
00411         int N=size();
00412         if(w.size()==1 && N!=1)
00413         {
00414             (*this)*=w.first();
00415             return *this;
00416         }
00417         else if(w.size()==N)
00418         {
00419             for(int k=0;k<N;++k)
00420                 v[k]*=w[k];
00421             return *this;
00422         }
00423         else
00424         {std::cout<<"Error in MC_v3d_vector*=(MC_double_vector), size are not compatible: "<<size()<<"!="<<w.size()<<std::endl;exit(-1);}
00425     }
00426 
00427     MC_v3d_vector MC_v3d_vector::normalized() const
00428     {
00429         int N=size();MC_v3d_vector res(N);
00430         for(int k=0;k<N;++k)
00431             res[k]=v[k].normalized();
00432         return res;
00433     }
00434 
00435     MC_v3d_vector& MC_v3d_vector::scale(const MC_v3d_vector& s)
00436     {
00437         int N=size();
00438         for(int k=0;k<N;++k)
00439             v[k].scale(s);
00440         return *this;
00441     }
00442 
00443     std::map <MC_v3d,int,MC_v3d_less> MC_v3d_vector::to_map() const
00444     {
00445         std::map <MC_v3d,int,MC_v3d_less> map_point;
00446         int N=size();
00447         for(int k=0;k<N;k++)
00448             map_point.insert(std::pair<MC_v3d,int>(v[k],k));
00449         return map_point;
00450     }
00451     std::set <MC_v3d,MC_v3d_less> MC_v3d_vector::to_set() const
00452     {
00453         std::set <MC_v3d,MC_v3d_less> set_point;
00454         int N=size();
00455         for(int k=0;k<N;k++)
00456             set_point.insert(v[k]);
00457         return set_point;
00458     }
00459     std::list <MC_v3d> MC_v3d_vector::to_list() const
00460     {
00461         std::list <MC_v3d> list_point;
00462         int N=size();
00463         for(int k=0;k<N;k++)
00464             list_point.push_back(v[k]);
00465 
00466         return list_point;
00467     }
00468 
00469     MC_v3d MC_v3d_vector::barycenter() const
00470     {
00471         return MC_v3d_vector::sum(*this)/size();
00472     }
00473     MC_v3d_vector operator*(const double& to_mult,const MC_v3d_vector& vec)
00474     {return vec*to_mult;}
00475 
00476     const MC_v3d* MC_v3d_vector::pointer() const{return &v[0];}
00477     MC_v3d* MC_v3d_vector::pointer_unprotected() {return &v[0];}
00478 
00479     std::pair <MC_v3d_vector,double> MC_v3d_vector::scaled_to_unit() const
00480     {
00481         if(size()==0)
00482         {std::cout<<"Warning in MC_v3d_vector::scaled_to_unit(), size=0"<<std::endl;return std::pair<MC_v3d_vector,double>(*this,1.0);}
00483         std::pair<MC_v3d,MC_v3d> bb=bounding_box_elements();
00484         MC_v3d L=bounding_box_length();
00485         double Lmax=std::max(std::max(L[0],L[1]),L[2]);
00486         if(Lmax<0.000001)
00487         {std::cout<<"Error in MC_v3d_vector::scaled_to_unit(), vector has zero length"<<std::endl;exit(-1);}
00488         double factor=1/Lmax;
00489         return std::pair <MC_v3d_vector,double> ((*this)*factor,factor);
00490     }
00491     std::pair <MC_v3d,MC_v3d> MC_v3d_vector::bounding_box_elements() const
00492     {
00493         MC_v3d x_max=first(),x_min=first();
00494         int N=size();
00495         for(int k=0;k<N;++k)
00496         {
00497             MC_v3d x=v[k];
00498 
00499             for(int k_dim=0;k_dim<3;++k_dim)
00500             {
00501                 if(x_max[k_dim]<x[k_dim])
00502                     x_max[k_dim]=x[k_dim];
00503                 if(x_min[k_dim]>x[k_dim])
00504                     x_min[k_dim]=x[k_dim];
00505             }
00506         }
00507         return std::pair <MC_v3d,MC_v3d> (x_min,x_max);
00508     }
00509 
00510     MC_v3d MC_v3d_vector::bounding_box_length() const
00511     {
00512         std::pair <MC_v3d,MC_v3d> bb=bounding_box_elements();
00513         return bb.second-bb.first;
00514     }
00515 
00516 
00517 
00518 
00519     MC_double_vector MC_v3d_vector::norm(const MC_v3d_vector& vec)
00520     {
00521         int N=vec.size();
00522         MC_double_vector n=MC_double_vector::zeros(N);
00523         for(int k=0;k<N;++k)
00524             n[k]=vec[k].norm();
00525         return n;
00526     }
00527 
00528     std::ostream& MC_v3d_vector::export_stream(std::ostream& output) const
00529     {
00530         int N=size();
00531         for(int k=0;k<N;++k)
00532             output<<v[k][0]<<" "<<v[k][1]<<" "<<v[k][2]<<" ";
00533         return output;
00534     }
00535     MC_v3d_vector& MC_v3d_vector::read_stream(std::istream& input)
00536     {
00537         while(input.good())
00538         {
00539             MC_v3d temp(0,0,0);
00540             for(int k_dim=0;k_dim<3;++k_dim)
00541                 input>>temp[k_dim];
00542             if(input.good())
00543                 add(temp);
00544         }
00545         return *this;
00546     }
00547 
00548     std::vector <MC_segment> MC_v3d_vector::bounding_box_segment(const double& length_ratio) const
00549     {
00550         std::pair <MC_v3d,MC_v3d> bb=bounding_box_elements();
00551 
00552         double min_length=std::min(std::min(
00553                 std::fabs(bb.second[0]-bb.first[0]),
00554                 std::fabs(bb.second[1]-bb.first[1])),
00555                                    std::fabs(bb.second[2]-bb.first[2]));
00556 
00557         double actual_length=0.5*min_length*length_ratio;
00558 
00559         std::vector <MC_segment> v_seg;
00560 
00561         double epsilon=0.00001;
00562         if( std::fabs(length_ratio-1.0)>epsilon )
00563         {
00564             v_seg.push_back(bb.first+MC_segment(MC_v3d(0,0,0),MC_v3d(actual_length,0,0)));
00565             v_seg.push_back(bb.first+MC_segment(MC_v3d(0,0,0),MC_v3d(0,actual_length,0)));
00566             v_seg.push_back(bb.first+MC_segment(MC_v3d(0,0,0),MC_v3d(0,0,actual_length)));
00567 
00568             v_seg.push_back(bb.first.mask(0,1,1)+bb.second.mask(1,0,0)+MC_segment(MC_v3d(0,0,0),MC_v3d(-actual_length,0,0)));
00569             v_seg.push_back(bb.first.mask(0,1,1)+bb.second.mask(1,0,0)+MC_segment(MC_v3d(0,0,0),MC_v3d(0,actual_length,0)));
00570             v_seg.push_back(bb.first.mask(0,1,1)+bb.second.mask(1,0,0)+MC_segment(MC_v3d(0,0,0),MC_v3d(0,0,actual_length)));
00571 
00572             v_seg.push_back(bb.first.mask(1,0,1)+bb.second.mask(0,1,0)+MC_segment(MC_v3d(0,0,0),MC_v3d(actual_length,0,0)));
00573             v_seg.push_back(bb.first.mask(1,0,1)+bb.second.mask(0,1,0)+MC_segment(MC_v3d(0,0,0),MC_v3d(0,-actual_length,0)));
00574             v_seg.push_back(bb.first.mask(1,0,1)+bb.second.mask(0,1,0)+MC_segment(MC_v3d(0,0,0),MC_v3d(0,0,actual_length)));
00575 
00576             v_seg.push_back(bb.first.mask(1,1,0)+bb.second.mask(0,0,1)+MC_segment(MC_v3d(0,0,0),MC_v3d(actual_length,0,0)));
00577             v_seg.push_back(bb.first.mask(1,1,0)+bb.second.mask(0,0,1)+MC_segment(MC_v3d(0,0,0),MC_v3d(0,actual_length,0)));
00578             v_seg.push_back(bb.first.mask(1,1,0)+bb.second.mask(0,0,1)+MC_segment(MC_v3d(0,0,0),MC_v3d(0,0,-actual_length)));
00579 
00580 
00581             v_seg.push_back(bb.first.mask(0,0,1)+bb.second.mask(1,1,0)+MC_segment(MC_v3d(0,0,0),MC_v3d(-actual_length,0,0)));
00582             v_seg.push_back(bb.first.mask(0,0,1)+bb.second.mask(1,1,0)+MC_segment(MC_v3d(0,0,0),MC_v3d(0,-actual_length,0)));
00583             v_seg.push_back(bb.first.mask(0,0,1)+bb.second.mask(1,1,0)+MC_segment(MC_v3d(0,0,0),MC_v3d(0,0,actual_length)));
00584 
00585             v_seg.push_back(bb.first.mask(0,1,0)+bb.second.mask(1,0,1)+MC_segment(MC_v3d(0,0,0),MC_v3d(-actual_length,0,0)));
00586             v_seg.push_back(bb.first.mask(0,1,0)+bb.second.mask(1,0,1)+MC_segment(MC_v3d(0,0,0),MC_v3d(0,actual_length,0)));
00587             v_seg.push_back(bb.first.mask(0,1,0)+bb.second.mask(1,0,1)+MC_segment(MC_v3d(0,0,0),MC_v3d(0,0,-actual_length)));
00588 
00589             v_seg.push_back(bb.first.mask(1,0,0)+bb.second.mask(0,1,1)+MC_segment(MC_v3d(0,0,0),MC_v3d(actual_length,0,0)));
00590             v_seg.push_back(bb.first.mask(1,0,0)+bb.second.mask(0,1,1)+MC_segment(MC_v3d(0,0,0),MC_v3d(0,-actual_length,0)));
00591             v_seg.push_back(bb.first.mask(1,0,0)+bb.second.mask(0,1,1)+MC_segment(MC_v3d(0,0,0),MC_v3d(0,0,-actual_length)));
00592 
00593             v_seg.push_back(bb.second+MC_segment(MC_v3d(0,0,0),MC_v3d(-actual_length,0,0)));
00594             v_seg.push_back(bb.second+MC_segment(MC_v3d(0,0,0),MC_v3d(0,-actual_length,0)));
00595             v_seg.push_back(bb.second+MC_segment(MC_v3d(0,0,0),MC_v3d(0,0,-actual_length)));
00596         }
00597         else
00598         {
00599             v_seg.push_back(MC_segment(bb.first,bb.first.mask(0,1,1)+bb.second.mask(1,0,0)));
00600             v_seg.push_back(MC_segment(bb.first,bb.first.mask(1,0,1)+bb.second.mask(0,1,0)));
00601             v_seg.push_back(MC_segment(bb.first,bb.first.mask(1,1,0)+bb.second.mask(0,0,1)));
00602 
00603             v_seg.push_back(MC_segment(bb.second,bb.first.mask(0,0,1)+bb.second.mask(1,1,0)));
00604             v_seg.push_back(MC_segment(bb.second,bb.first.mask(0,1,0)+bb.second.mask(1,0,1)));
00605             v_seg.push_back(MC_segment(bb.second,bb.first.mask(1,0,0)+bb.second.mask(0,1,1)));
00606 
00607             v_seg.push_back(MC_segment(bb.first.mask(0,1,1)+bb.second.mask(1,0,0),bb.first.mask(0,0,1)+bb.second.mask(1,1,0)));
00608             v_seg.push_back(MC_segment(bb.first.mask(0,1,1)+bb.second.mask(1,0,0),bb.first.mask(0,1,0)+bb.second.mask(1,0,1)));
00609 
00610             v_seg.push_back(MC_segment(bb.first.mask(1,0,1)+bb.second.mask(0,1,0),bb.first.mask(0,0,1)+bb.second.mask(1,1,0)));
00611             v_seg.push_back(MC_segment(bb.first.mask(1,0,1)+bb.second.mask(0,1,0),bb.first.mask(1,0,0)+bb.second.mask(0,1,1)));
00612 
00613             v_seg.push_back(MC_segment(bb.first.mask(1,1,0)+bb.second.mask(0,0,1),bb.first.mask(1,0,0)+bb.second.mask(0,1,1)));
00614             v_seg.push_back(MC_segment(bb.first.mask(1,1,0)+bb.second.mask(0,0,1),bb.first.mask(0,1,0)+bb.second.mask(1,0,1)));
00615 
00616         }
00617 
00618         return v_seg;
00619     }
00620 
00621     std::pair<MC_v3d,int> MC_v3d_vector::closest(const MC_v3d& x) const
00622     {
00623         double min_dist=0;
00624         int k_min=-1;
00625         MC_v3d record_min;
00626         for(int k=0,N=size();k<N;++k)
00627         {
00628             const MC_v3d& y=v[k];
00629             double current_dist=(y-x).norm();
00630             if(current_dist<min_dist || k==0)
00631             {
00632                 min_dist=current_dist;
00633                 k_min=k;
00634                 record_min=y;
00635             }
00636         }
00637         return std::make_pair(record_min,k_min);
00638     }
00639 
00640 
00641     std::pair<MC_v3d_vector,MC_matrix> MC_v3d_vector::scaled_to_unit_and_center() const
00642     {
00643         std::pair<MC_v3d_vector,double> scaling=scaled_to_unit();
00644         std::pair<MC_v3d,MC_v3d> bb=scaling.first.bounding_box_elements();
00645         scaling.first=scaling.first-bb.first;
00646         MC_matrix M(4);
00647         for(int k=0;k<3;++k)
00648             M(k,k)=scaling.second;
00649         M.set_translation(-bb.first);
00650         return std::make_pair(scaling.first,M);
00651     }
00652 
00653     MC_v3d_vector MC_v3d_vector::inverted_position() const
00654     {
00655         MC_int_vector index=MC_int_vector::linspace(size()-1,0,-1);
00656         return (*this)(index);
00657     }
00658 
00659     MC_v3d_vector MC_v3d_vector::build_from_concatenated_vector(const MC_double_vector& X)
00660     {
00661         if(X.size()%3!=0)
00662         {std::cout<<"Error in MC_v3d_vector::build_from_concatenated_vector(), size is not correct"<<std::endl;exit(-1);}
00663         MC_v3d_vector y=MC_v3d_vector::zeros(X.size()/3);
00664         for(int k=0,N=X.size()/3;k<N;++k)
00665             for(int k_dim=0;k_dim<3;++k_dim)
00666                 y[k][k_dim]=X[3*k+k_dim];
00667         return y;
00668     }
00669 
00670     MC_v3d_vector MC_v3d_vector::removed(const MC_int_vector& index_to_remove) const
00671     {
00672         MC_v3d_vector new_vec;
00673         std::set<int> index_set=index_to_remove.to_set();
00674         for(int k=0,N=size();k<N;++k)
00675         {
00676             if(index_set.find(k)==index_set.end())
00677                 new_vec.add(v[k]);
00678         }
00679         return new_vec;
00680     }
00681     MC_v3d_vector MC_v3d_vector::build_duplicate(const unsigned int& N,const MC_v3d& value_to_duplicate)
00682     {
00683         MC_v3d_vector vec;
00684         vec.resize(N);
00685         for(int k=0;k<N;++k)
00686             vec[k]=value_to_duplicate;
00687         return vec;
00688     }
00689 
00690 }
00691 
00692 

Generated on Sun Apr 18 20:24:47 2010 by  doxygen 1.6.1