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)
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
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