Point_set.cpp

Go to the documentation of this file.
00001 /*
00002 **    Mesh Converter
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 #include <Point_set.h>
00021 
00022 Point_set::Point_set():vertex(){vertex.resize(0);}
00023 Point_set::Point_set(const Point_set &p):vertex(p.vertex){}
00024 Point_set::~Point_set(){vertex.resize(0);}
00025   
00026 int Point_set::destroy(){vertex.resize(0);return 0;}
00027 
00028 
00029 
00030 int Point_set::get_vertex_number() const{return size();}
00031 int Point_set::size() const{
00032   if( vertex.size()%3 != 0)
00033     {printf("Error vertex size is not correct in Point_set (not divisible by 3) [%d]\n",int(vertex.size()));exit(-1);}
00034   return vertex.size()/3;
00035 }
00036 
00037 int Point_set::resize(int _N_vertex){vertex.resize(3*_N_vertex);return 0;}
00038 
00039 double& Point_set::operator[](int index)
00040 {
00041   if(index<0)
00042     {printf("Error index<0 (%d) in operator[] in Point_set\n",index);exit(-1);}
00043   else if(index>=int(vertex.size()))
00044     {printf("Error in operator[], index too large compared to size in Point_set (%d/%d)\n",index,vertex.size());exit(-1);}
00045   return vertex[index];
00046 }
00047 double Point_set::operator[](int index) const
00048 {
00049   if(index<0)
00050     {printf("Error index<0 (%d) in operator[] {const} in Point_set\n",index);exit(-1);}
00051   else if(index>=int(vertex.size()))
00052     {printf("Error in operator[] {const}, index too large compared to size in Point_set (%d/%d)\n",index,vertex.size());exit(-1);}
00053   return vertex[index];
00054 }
00055 
00056 
00057 double& Point_set::get_vertex(int k_vertex,int k_dim){return (*this)[3*k_vertex+k_dim];}
00058 double  Point_set::get_vertex(int k_vertex,int k_dim) const{return (*this)[3*k_vertex+k_dim];}
00059 const double* Point_set::get_vertex_p(int k_vertex)
00060 {
00061   if(k_vertex<0)
00062     {printf("Error index<0 (%d) in get_vertex_p in Point_set\n",k_vertex);exit(-1);}
00063   else if(3*k_vertex+2>=int(vertex.size()))
00064     {printf("Error in get_vertex_p, index too large compared to size in Point_set (%d/%d)\n",k_vertex,vertex.size());exit(-1);}
00065   return &vertex[3*k_vertex];
00066 }
00067 
00068 V_3D Point_set::get_vertex(int k_vertex) const
00069 {
00070   V_3D v(get_vertex(k_vertex,0),get_vertex(k_vertex,1),get_vertex(k_vertex,2));
00071   return v;
00072 }
00073 V_3D Point_set::get_vertex_v3d(int k_vertex) const{return get_vertex(k_vertex);}
00074 
00075 
00076 
00077 int Point_set::set_vertex(int k_vertex,double x,double y,double z)
00078 {
00079   (*this)[3*k_vertex+0]=x;
00080   (*this)[3*k_vertex+1]=y;
00081   (*this)[3*k_vertex+2]=z;
00082   return 0;
00083 }
00084 int Point_set::set_vertex(int k_vertex,int k_dim,double value)
00085 {V_3D v;v.set(k_dim,value);return set_vertex(k_vertex,v);}
00086 int Point_set::set_vertex(int k_vertex,V_3D v)
00087 {return set_vertex(k_vertex,v[0],v[1],v[2]);}
00088 int Point_set::set_vertex(int k_vertex,double* v)
00089 {return set_vertex(k_vertex,v[0],v[1],v[2]);}
00090 int Point_set::set_vertex(int k_vertex,int dim,double *v)
00091 {for(int k=0;k<dim;k++){set_vertex(k_vertex+k,&v[3*k]);}return 0;}
00092 int Point_set::set_vertex(const Point_set& p)
00093 {(*this)=p;return 0;}
00094 
00095 
00096 int Point_set::add_vertex(double x,double y,double z)
00097 {vertex.push_back(x);vertex.push_back(y);vertex.push_back(z);return 0;}
00098 int Point_set::add_vertex(const V_3D& v)
00099 {return add_vertex(v[0],v[1],v[2]);}
00100 int Point_set::add_vertex(const std::vector <double>& to_add)
00101 {
00102   if((to_add.size()%3)!=0)
00103     {printf("Error in add_vertex in Point_set, size of to_add is not multiple of 3 (%d)\n",to_add.size());exit(-1);}
00104   int k_vertex=0;
00105   for(k_vertex=0;k_vertex<int(to_add.size())/3;k_vertex++)
00106     add_vertex(to_add[3*k_vertex+0],to_add[3*k_vertex+1],to_add[3*k_vertex+2]);
00107   return 0;
00108 }
00109 int Point_set::add_vertex(const std::vector <V_3D>& to_add)
00110 {
00111   int k_vertex=0;
00112   for(k_vertex=0;k_vertex<int(to_add.size());k_vertex++)
00113     add_vertex(to_add[k_vertex]);
00114   return 0;
00115 }
00116 int Point_set::add_vertex(const double* v){return add_vertex(v[0],v[1],v[2]);}
00117 int Point_set::add_vertex(int dim,double *v)
00118 {for(int k=0;k<dim;k++){add_vertex(v[3*k+0],v[3*k+1],v[3*k+2]);}return 0;}
00119 int Point_set::add_vertex(const Point_set& p)
00120 {return add_vertex(p.get_vertex_vector());}
00121 
00122 
00123 
00124 
00125 
00126 
00127 
00128 int Point_set::exist(const V_3D& v,double epsilon) const
00129 {
00130   int k_vertex=0;
00131   int N_vertex=size();
00132   V_3D x;
00133   for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00134     {
00135       x=get_vertex(k_vertex);
00136       if(v.equal(x,epsilon)==1)
00137         return k_vertex;
00138     }
00139   return -1;
00140 }
00141 int Point_set::exist(const V_3D& v) const{return exist(v,0.00001);}
00142 int Point_set::exist(double x,double y,double z) const{return exist(x,y,z,0.00001);}
00143 int Point_set::exist(double x,double y,double z,double epsilon) const{V_3D X(x,y,z);return exist(X,epsilon);}
00144 
00145 
00146 int Point_set::add_unique(double x,double y,double z,double epsilon)
00147 {
00148   if(exist(x,y,z,epsilon)==-1)
00149     return add_vertex(x,y,z);
00150   return -1;
00151 }
00152 int Point_set::add_unique(const V_3D& v,double epsilon)
00153 {
00154   if(exist(v,epsilon)==-1)
00155     return add_vertex(v);
00156   return -1;
00157 }
00158 int Point_set::add_unique(const double* v,double epsilon)
00159 {
00160   if(exist(v[0],v[1],v[2],epsilon)==-1)
00161     return add_vertex(v);
00162   return -1;
00163 }
00164 
00165 
00166 int Point_set::eliminate(int k_index)
00167 {
00168   if(k_index<0 || k_index>=get_vertex_number())
00169     {printf("Error k_index too large in eliminate (%d/%d)\n",k_index,get_vertex_number());exit(-1);}
00170   int k_vertex=0,N_vertex=get_vertex_number();
00171   int k_dim=0;
00172   for(k_vertex=k_index;k_vertex<N_vertex-1;k_vertex++)
00173     for(k_dim=0;k_dim<3;k_dim++)
00174       vertex[3*k_vertex+k_dim]=vertex[3*(k_vertex+1)+k_dim];
00175   vertex.resize(N_vertex-1);
00176   return 0;
00177 }
00178 int Point_set::eliminate(const std::vector <int>& k_index)
00179 {
00180   int k_vertex=0;
00181   int N_vertex=k_index.size();
00182   for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00183     eliminate(k_index[k_vertex]);
00184   return 0;
00185 }
00186 int Point_set::eliminate(double x,double y,double z){return eliminate(x,y,z,0.00001);}
00187 int Point_set::eliminate(double x,double y,double z,double epsilon)
00188 {
00189   int k_index=0;
00190   k_index=exist(x,y,z,epsilon);
00191   if(k_index!=-1)
00192     return eliminate(k_index);
00193   
00194   return -1;
00195 }
00196 int Point_set::eliminate(const V_3D& x,double epsilon){return eliminate(x[0],x[1],x[2],epsilon);}
00197 int Point_set::eliminate(const V_3D& x){return eliminate(x[0],x[1],x[2],0.00001);}
00198 int Point_set::eliminate(const double* x,double epsilon){return eliminate(x[0],x[1],x[2],epsilon);}
00199 int Point_set::eliminate(const double* x){return eliminate(x[0],x[1],x[2],0.00001);}
00200 int Point_set::eliminate(const std::vector <double>& k_index)
00201 {
00202   int k_vertex=0;
00203   int N_index=0;
00204   if((k_index.size()%3)!=0)
00205     {printf("Error size of k_index in eliminate is not divisible by 3 (%d)\n",k_index.size());exit(-1);}
00206   for(k_vertex=0;k_vertex<N_index/3;k_vertex++)
00207     eliminate(k_index[3*k_vertex+0],k_index[3*k_vertex+1],k_index[3*k_vertex+2]);
00208   return 0;
00209 }
00210 
00211 
00212 
00213 
00214 
00215 
00216 
00217 
00218 int Point_set::matrix_transform(const Matrix& M)
00219 {
00220   int k_vertex=0,N_vertex=get_vertex_number();
00221   for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00222     set_vertex(k_vertex,M*get_vertex_v3d(k_vertex));
00223   return 0;  
00224 }
00225 
00226 
00227 
00228 int Point_set::rotate(const V_3D& n,double angle){return rotate(n[0],n[1],n[2],angle);}
00229 int Point_set::rotate(double n_x,double n_y,double n_z,double angle)
00230 {
00231   Matrix R;
00232   R.set_rotation_matrix(n_x,n_y,n_z,angle);
00233   return matrix_transform(R);
00234 }
00235 int Point_set::rotate(const double *n,double angle){return rotate(n[0],n[1],n[2],angle);}
00236 
00237 
00238 
00239 int Point_set::rotate(const V_3D& n,double angle,const V_3D& center)
00240 {return rotate(n[0],n[1],n[2],angle,center);}
00241 int Point_set::rotate(double n_x,double n_y,double n_z,double angle,const V_3D& center)
00242 {
00243   Matrix R;R.set_rotation_matrix(n_x,n_y,n_z,angle);
00244   Matrix T;T.set_translation(center[0],center[1],center[2]);
00245   Matrix iT;iT.set_translation(-center[0],-center[1],-center[2]);
00246   Matrix M = T*R*iT;
00247 
00248   return matrix_transform(M);
00249 }
00250 int Point_set::rotate(const double *n,double angle,const V_3D& center)
00251 {return rotate(n[0],n[1],n[2],angle,center);}
00252 
00253 
00254 
00255 int Point_set::translate(double t_x,double t_y,double t_z)
00256 {
00257   int k_vertex=0,N_vertex=get_vertex_number();
00258   for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00259     set_vertex(k_vertex,vertex[3*k_vertex+0]+t_x,vertex[3*k_vertex+1]+t_y,vertex[3*k_vertex+2]+t_z);
00260   return 0;
00261 }
00262 int Point_set::translate(const double *t) {return translate(t[0],t[1],t[2]);}
00263 int Point_set::translate(const V_3D& t) {return translate(t[0],t[1],t[2]);}
00264 
00265 
00266 
00267 
00268 
00269 
00270 int Point_set::scale(double s_x,double s_y,double s_z)
00271 {
00272   double epsilon=0.000001;
00273   if(fabs(s_x)<epsilon)
00274     {printf("Warning scaling x=0.0 \n");}
00275   if(fabs(s_y)<epsilon)
00276     {printf("Warning scaling y=0.0 \n");}
00277   if(fabs(s_z)<epsilon)
00278     {printf("Warning scaling z=0.0 \n");}
00279 
00280   int k_vertex=0,N_vertex=get_vertex_number();
00281   for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00282     set_vertex(k_vertex,vertex[3*k_vertex+0]*s_x,vertex[3*k_vertex+1]*s_y,vertex[3*k_vertex+2]*s_z);
00283   return 0;  
00284 }
00285 int Point_set::scale(const double *s) {return scale(s[0],s[1],s[2]);}
00286 int Point_set::scale(const V_3D& s) {return scale(s[0],s[1],s[2]);}
00287 int Point_set::scale(double s) {return scale(s,s,s);}
00288 
00289 
00290 
00291 
00292 
00293 
00294 int Point_set::rotate_centered(const V_3D& n,double angle)
00295 {
00296   V_3D center=get_middle_point();
00297   translate(-1.0*center);
00298   rotate(n,angle);
00299   translate( center);
00300   return 0;
00301 }
00302 int Point_set::rotate_centered(double n_x,double n_y,double n_z,double angle)
00303 {V_3D n(n_x,n_y,n_z);return rotate_centered(n,angle);}
00304 int Point_set::rotate_centered(const double *n,double angle)
00305 {V_3D n_v3d(n[0],n[1],n[2]);return rotate_centered(n_v3d,angle);}
00306 
00307 
00308 
00309 int Point_set::scale_centered(double s_x,double s_y,double s_z)
00310 {
00311   V_3D center=get_middle_point();
00312   translate(-1.0*center);
00313   scale(s_x,s_y,s_z);
00314   translate( center);
00315   return 0;
00316 }
00317 int Point_set::scale_centered(const double *s){return scale_centered(s[0],s[1],s[2]);}
00318 int Point_set::scale_centered(const V_3D& s){return scale_centered(s[0],s[1],s[2]);}
00319 int Point_set::scale_centered(double s){return scale_centered(s,s,s);}
00320 
00321 
00322 
00323 
00324 
00325 
00326 
00327 
00328 
00329 V_3D Point_set::get_middle_point() const
00330 {
00331   V_3D min_point = get_min_point();
00332   V_3D max_point = get_max_point();
00333 
00334   return 0.5*(min_point+max_point); 
00335 }
00336 V_3D Point_set::get_min_point() const
00337 {
00338   V_3D min_point(9999,9999,9999);
00339   V_3D current;
00340   int k_vertex=0,N_vertex=get_vertex_number();
00341   int k_dim=0;
00342   for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00343     {
00344       current = get_vertex_v3d(k_vertex);
00345       for(k_dim=0;k_dim<3;k_dim++)
00346         if(current[k_dim]<min_point[k_dim])
00347           min_point[k_dim] = current[k_dim];
00348     }
00349 
00350   return min_point;
00351 }
00352 V_3D Point_set::get_max_point() const
00353 {
00354   V_3D max_point(-9999,-9999,-9999);
00355   V_3D current;
00356   int k_vertex=0,N_vertex=get_vertex_number();
00357   int k_dim=0;
00358   for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00359     {
00360       current = get_vertex_v3d(k_vertex);
00361       for(k_dim=0;k_dim<3;k_dim++)
00362         if(current[k_dim]>max_point[k_dim])
00363           max_point[k_dim] = current[k_dim];
00364     }
00365   return max_point;
00366 }
00367 V_3D Point_set::get_size_set() const
00368 {
00369   V_3D min_point = get_min_point();
00370   V_3D max_point = get_max_point();
00371 
00372   return (max_point-min_point);
00373 }
00374 
00375 
00376 int Point_set::center_point_set(){return translate(-1.0*get_middle_point());}
00377 
00378 
00379 
00380 
00381 
00382 
00383 
00384 
00385 
00386 
00387 double Point_set::get_closest_distance(double x,double y,double z,int *index) const
00388 {V_3D X(x,y,z);return get_closest_distance(X,index);}
00389 double Point_set::get_closest_distance(const double* x,int *index) const
00390 {return get_closest_distance(x[0],x[1],x[2],index);}
00391 double Point_set::get_closest_distance(const V_3D& x,int *index) const
00392 {
00393   int k_vertex=0;
00394   double min_dist=9999999.0;
00395   V_3D current;
00396   double current_dist=0.0;
00397   for(k_vertex=0;k_vertex<size();k_vertex++)
00398     {
00399       current = get_vertex_v3d(k_vertex);
00400       current_dist=(x-current).norm();
00401       if(min_dist>current_dist)
00402         {
00403           *index=k_vertex;
00404           min_dist=current_dist;
00405         }
00406     }
00407   return min_dist;
00408 }
00409 
00410 
00411 
00412 
00413 
00414 
00415 double Point_set::get_further_distance(double x,double y,double z,int *index) const
00416 {V_3D X(x,y,z);return get_further_distance(X,index);}
00417 double Point_set::get_further_distance(const double* x,int *index) const
00418 {return get_further_distance(x[0],x[1],x[2],index);}
00419 double Point_set::get_further_distance(const V_3D& x,int *index) const
00420 {
00421   int k_vertex=0;
00422   double max_dist=0.0;
00423   V_3D current;
00424   double current_dist=0.0;
00425   for(k_vertex=0;k_vertex<size();k_vertex++)
00426     {
00427       current = get_vertex_v3d(k_vertex);
00428       current_dist=(x-current).norm();
00429       if(max_dist<current_dist)
00430         {
00431           *index=k_vertex;
00432           max_dist=current_dist;
00433         }
00434     }
00435   return max_dist;
00436 }
00437 
00438 
00439 double Point_set::distance_to_index(double x,double y,double z,int index) const
00440 {V_3D X(x,y,z);return distance_to_index(X,index);}
00441 double Point_set::distance_to_index(const double* x,int index) const
00442 {V_3D X(x[0],x[1],x[2]);return distance_to_index(X,index);}
00443 double Point_set::distance_to_index(const V_3D& x,int index) const
00444 {return (x-get_vertex_v3d(index)).norm();}
00445 
00446 
00447 
00448 
00449 std::vector <int> Point_set::N_closest(const V_3D& center,int _N_closest) const
00450 {
00451   std::vector <int> closest;
00452   std::vector <double> dist;
00453   std::vector <double> full_dist(size());
00454 
00455   closest.resize(_N_closest);
00456   dist.resize(_N_closest);
00457 
00458   int k_vertex=0,N_vertex=size();
00459   V_3D current;
00460 
00461   //calculate every distance to every vertex
00462   for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00463     {
00464       current=get_vertex_v3d(k_vertex);
00465       full_dist[k_vertex] = (current-center).norm();
00466     }
00467   
00468   int k_closest=0;
00469   //first case
00470   for(k_vertex=0,dist[0]=9999.9;k_vertex<N_vertex;k_vertex++)
00471     if(full_dist[k_vertex]<dist[0]){closest[0]=k_vertex;dist[0]=full_dist[k_vertex];}
00472   //other case
00473   for(k_closest=1;k_closest<_N_closest;k_closest++)
00474     for(k_vertex=0,dist[k_closest]=9999.9;k_vertex<N_vertex;k_vertex++)
00475       if(full_dist[k_vertex]<dist[k_closest] && dist[k_closest]>dist[k_closest-1])
00476         {closest[k_closest]=k_vertex;dist[k_closest]=full_dist[k_vertex];}
00477   
00478   return closest;
00479 }
00480 std::vector <int> Point_set::N_closest(double x,double y,double z,int _N_closest) const
00481 {V_3D X(x,y,z);return N_closest(X,_N_closest);}
00482 std::vector <int> Point_set::N_closest(double *x,int _N_closest) const
00483 {return N_closest(x[0],x[1],x[2],_N_closest);}
00484 
00485 
00486 
00487 
00488 
00489 
00490 std::vector <int> Point_set::inside_circle(const V_3D& center,double radius) const
00491 {
00492   std::vector <int> points;
00493   int k_vertex=0,N_vertex=size();
00494   V_3D current;
00495   for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00496     if( (current-center).norm()<=radius )
00497       points.push_back(k_vertex);
00498 
00499   return points;
00500 }
00501 std::vector <int> Point_set::inside_circle(double x,double y,double z,double radius) const
00502 {V_3D X(x,y,z);return inside_circle(X,radius);}
00503 
00504 
00505 
00506 
00507 
00508 
00509 
00510 
00511 
00512 std::vector <int> Point_set::outside_circle(const V_3D& center,double radius) const
00513 {
00514   std::vector <int> points;
00515   int k_vertex=0,N_vertex=size();
00516   V_3D current;
00517   for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00518     if( (current-center).norm()>radius )
00519       points.push_back(k_vertex);
00520 
00521   return points;
00522 }
00523 std::vector <int> Point_set::outside_circle(double x,double y,double z,double radius) const
00524 {V_3D X(x,y,z);return outside_circle(X,radius);}
00525 
00526 
00527 
00528 
00529 
00530 
00531 
00532 std::vector <int> Point_set::inside_box(const V_3D& p1,const V_3D& p2) const
00533 {
00534   std::vector <int> point;
00535   int k_vertex=0,N_vertex=size();
00536   V_3D current;
00537 
00538   V_3D A=p1.get_min_scalar(p2);
00539   V_3D B=p1.get_max_scalar(p2);
00540   for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00541     {
00542       current=get_vertex_v3d(k_vertex);
00543       if(current>=A && current<=B)
00544         point.push_back(k_vertex);
00545     }
00546   return point;
00547 }
00548 std::vector <int> Point_set::outside_box(const V_3D& p1,const V_3D& p2) const
00549 {
00550   std::vector <int> point;
00551   int k_vertex=0,N_vertex=size();
00552   V_3D current;
00553 
00554   V_3D A=p1.get_min_scalar(p2);
00555   V_3D B=p1.get_max_scalar(p2);
00556   for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00557     {
00558       current=get_vertex_v3d(k_vertex);
00559       if(!(current>=A && current<=B))
00560         point.push_back(k_vertex);
00561     }
00562   return point;
00563 }
00564 
00565 std::vector <int> Point_set::inside_tetrahedra(const V_3D& p1,const V_3D& p2,const V_3D& p3,const V_3D& p4) const
00566 {
00567   std::vector <int> point;
00568   int k_vertex=0,N_vertex=size();
00569   V_3D current;
00570 
00571   for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00572     {
00573       current=get_vertex_v3d(k_vertex);
00574       if(current.is_inside_volume(p1,p2,p3,p4)==1)
00575         point.push_back(k_vertex);
00576     }
00577   return point;
00578 }
00579 
00580 std::vector <int> Point_set::outside_tetrahedra(const V_3D& p1,const V_3D& p2,const V_3D& p3,const V_3D& p4) const
00581 {
00582   std::vector <int> point;
00583   int k_vertex=0,N_vertex=size();
00584   V_3D current;
00585 
00586   for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00587     {
00588       current=get_vertex_v3d(k_vertex);
00589       if(current.is_inside_volume(p1,p2,p3,p4)==0)
00590         point.push_back(k_vertex);
00591     }
00592   return point;
00593 }
00594 
00595 std::vector <int> Point_set::in_half_space(const V_3D& n,const V_3D& x0) const
00596 {
00597   std::vector <int> point;
00598   int k_vertex=0,N_vertex=size();
00599   V_3D current;
00600 
00601   for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00602     {
00603       current=get_vertex_v3d(k_vertex);
00604       if(current.distance_to_oriented_plane(n,x0)>0)
00605         point.push_back(k_vertex);
00606     }
00607   return point;
00608 }
00609 
00610 std::vector <int> Point_set::other_index(const std::vector <int>& index) const
00611 {
00612   std::vector <int> point;
00613   int k_vertex=0,N_vertex=size();
00614   int k_vertex_2=0,N_vertex_2=index.size();
00615   int is_found=0;
00616   for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00617     {
00618       is_found=0;
00619       for(k_vertex_2=0;is_found==0 && k_vertex_2<N_vertex_2;k_vertex_2++)
00620         if(k_vertex==k_vertex_2)
00621           is_found=1;
00622       if(is_found==0)
00623         point.push_back(k_vertex);
00624     }
00625   return point;
00626 }
00627 
00628 
00629 const double* Point_set::get_vertex() const{return &vertex[0];}
00630 std::vector <double> Point_set::get_vertex_vector() const{return vertex;}
00631 
00632 V_3D Point_set::operator()(int index) const
00633 {
00634   if(3*index+2>=int(vertex.size()) || index<0)
00635     {printf("Error in operator() in Point_set index(%d) is not correct in size(%d)\n",index,vertex.size());exit(-1);}
00636 
00637   V_3D v(vertex[3*index],vertex[3*index+1],vertex[3*index+2]);
00638   return v;
00639 }
00640 double Point_set::operator()(int index,int k_dim) const
00641 {
00642   if(3*index+k_dim<0 || 3*index+k_dim>=int(vertex.size()))
00643     {printf("Error int const operator(index,k_dim) is not correct in operator() in Point_set -> (%d,%d) with size=%d\n",index,k_dim,vertex.size());exit(-1);}
00644   return vertex[3*index+k_dim];
00645 }
00646 double& Point_set::operator()(int index,int k_dim)
00647 {
00648   if(3*index+k_dim<0 || 3*index+k_dim>=int(vertex.size()))
00649     {printf("Error in operator(index,k_dim) is not correct in operator() in Point_set -> (%d,%d) with size=%d\n",index,k_dim,vertex.size());exit(-1);}
00650   return vertex[3*index+k_dim];
00651 }
00652 
00653 
00654 
00655 int Point_set::keep_index(int k_start,int k_end)
00656 {
00657   if(k_start>k_end || k_start<0 || k_end>=size())
00658     {printf("Error in keep_index in Point_set, (k_start,k_end)=(%d,%d) and size=%d\n",k_start,k_end,size());exit(-1);}
00659 
00660   vector <double> new_vertex;
00661   int k_vertex=0;
00662   int k_dim=0;
00663   for(k_vertex=k_start;k_vertex<=k_end;k_vertex++)
00664     for(k_dim=0;k_dim<3;k_dim++)
00665       new_vertex.push_back(get_vertex(k_vertex,k_dim));
00666   vertex=new_vertex;
00667   return 0;
00668 }
00669 int Point_set::delete_index(int k_start,int k_end)
00670 {
00671   if(k_start>k_end || k_start<0 || k_end>=size())
00672     {printf("Error in delete_index in Point_set, (k_start,k_end)=(%d,%d) and size=%d\n",k_start,k_end,size());exit(-1);}
00673 
00674   vector <double> new_vertex;
00675   int k_vertex=0;
00676   int N_vertex=size();
00677   int k_dim=0;
00678   for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00679     if(k_vertex<k_start || k_vertex>k_end)
00680       for(k_dim=0;k_dim<3;k_dim++)
00681         new_vertex.push_back(get_vertex(k_vertex,k_dim));
00682   vertex=new_vertex;
00683   return 0;  
00684 }
00685 
00686 
00687 
00688 
00689 
00690 
00691 
00692 
00693 
00694 Point_set operator+(const Point_set& p, V_3D T)
00695 {
00696   Point_set set;
00697   int N_vertex=p.size();
00698   int k_vertex=0;
00699   for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00700     set.set_vertex(k_vertex,p(k_vertex)+T);
00701   return set;
00702 }
00703 Point_set operator+(V_3D T,const Point_set& p)
00704 {
00705   Point_set set;
00706   int N_vertex=p.size();
00707   int k_vertex=0;
00708   for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00709     set.set_vertex(k_vertex,p(k_vertex)+T);
00710   return set;
00711 }
00712 
00713 Point_set operator-(const Point_set& p, V_3D T)
00714 {
00715   Point_set set;
00716   int N_vertex=p.size();
00717   int k_vertex=0;
00718   for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00719     set.set_vertex(k_vertex,p(k_vertex)-T);
00720   return set;
00721 }
00722 Point_set operator-(V_3D T,const Point_set& p)
00723 {
00724   Point_set set;
00725   int N_vertex=p.size();
00726   int k_vertex=0;
00727   for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00728     set.set_vertex(k_vertex,T-p(k_vertex));
00729   return set;
00730 }
00731 
00732 
00733 Point_set operator*(const Matrix& M,const Point_set& p)
00734 {
00735   Point_set set;
00736   int N_vertex=p.size();
00737   int k_vertex=0;
00738   for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00739     set.set_vertex(k_vertex,M*p(k_vertex));
00740   return set;
00741 }
00742 
00743 bool operator==(const Point_set& pa,const Point_set& pb)
00744 {
00745   if(pa.size()==pb.size())
00746     {
00747       int k_vertex=0,N_vertex=pa.size();
00748       for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00749         if(pa(k_vertex)!=pb(k_vertex))
00750           return false;
00751       return true;
00752     }
00753   return false;
00754 }
00755 
00756 bool operator!=(const Point_set& pa,const Point_set& pb)
00757 {
00758   if(pa.size()==pb.size())
00759     {
00760       int k_vertex=0,N_vertex=pa.size();
00761       for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00762         if(pa(k_vertex)!=pb(k_vertex))
00763           return true;
00764       return false;
00765     }
00766   return true;
00767 }
00768 
00769 ostream& operator << (ostream& flux, const Point_set& p)
00770 {
00771   int k_vertex=0;
00772   int N_vertex=p.size();
00773   for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00774     flux<<"("<<p.get_vertex(k_vertex,0)<<","<<p.get_vertex(k_vertex,1)<<","<<p.get_vertex(k_vertex,2)<<")\n";
00775   return flux;
00776 }
00777 
00778 const Point_set& Point_set::operator=(const Point_set& p)
00779 {
00780   vertex=p.get_vertex_vector();
00781   return (*this);
00782 }
00783 
00784 
00785 
00786 
00787 
00788 int Point_set::load_off_file(const char* filename)
00789 {std::string file=filename;return load_off_file(file);}
00790 int Point_set::load_off_file(const std::string& filename)
00791 {
00792  
00793   destroy();
00794 
00795 #define SIZE_BUFFER 2048
00796   char buffer[SIZE_BUFFER]={'\0'};
00797   
00798   FILE *fid=NULL;
00799   fid=fopen(filename.data(),"r");
00800   if(fid==NULL)
00801     {printf("ERROR loading %s in load_off_file in Point_set\n",filename.data());exit(-1);}
00802 
00803 
00804 
00805   //detect if OFF or NOFF
00806   int is_NOFF=0;
00807   while(strcmp(buffer,"OFF")!=0 && strcmp(buffer,"NOFF")!=0)
00808     {
00809       if(fscanf(fid,"%s",buffer)==EOF)
00810         {printf("ERROR file %s is not off file\n",filename.data());exit(-1);}
00811       if(buffer[0]=='#')//comments
00812         fgets(buffer,sizeof(buffer),fid);
00813     }
00814   if(strcmp(buffer,"NOFF")==0)
00815     is_NOFF=1;
00816 
00817   //pass comments
00818   fscanf(fid,"%s",buffer);
00819   while(buffer[0]=='#')//comments
00820     {
00821       fgets(buffer,sizeof(buffer),fid);
00822       fscanf(fid,"%s",buffer);
00823     }
00824 
00825 
00826   //read Number of vertices
00827   int N_vertex=0;
00828   int k_vertex=0;
00829   N_vertex=atoi(buffer);//N_vertex
00830   fgets(buffer,sizeof(buffer),fid);//read line
00831 
00832   float X[3]={0.0,0.0,0.0};
00833   if(is_NOFF==0)
00834     while(k_vertex<N_vertex)
00835       {
00836         if(fscanf(fid,"%f %f %f",X,X+1,X+2)!=3)
00837           {
00838             fscanf(fid,"%s",buffer);
00839             if(buffer[0]!='#')
00840               {printf("ERROR loading %s in Point_set\n",filename.data());exit(-1);}
00841             else//read line
00842               fgets(buffer,sizeof(buffer),fid);
00843           }
00844         else
00845           {
00846             add_vertex(X[0],X[1],X[2]);
00847             k_vertex++;
00848           }
00849       }
00850   else
00851     while(k_vertex<N_vertex)
00852       {
00853         if(fscanf(fid,"%f %f %f %*f %*f %*f",X,X+1,X+2)!=3)
00854           {
00855             fscanf(fid,"%s",buffer);
00856             if(buffer[0]!='#')
00857               {printf("ERROR loading %s in Point_set\n",filename.data());exit(-1);}
00858             else//read line
00859               fgets(buffer,sizeof(buffer),fid);
00860           }
00861         else
00862           {
00863             add_vertex(X[0],X[1],X[2]);
00864             k_vertex++;
00865           }
00866       }
00867 
00868 
00869   if(fclose(fid)!=0)
00870     {printf("ERROR closing %s in load_off_file in Point_set\n",filename.data());exit(-1);}
00871 
00872   return 0;
00873 }
00874 
00875 
00876 int Point_set::write_off_type(const char* filename) const
00877 {std::string file=filename;return write_off_type(file);}
00878 int Point_set::write_off_type(const std::string& filename) const
00879 {
00880   FILE *fid=NULL;
00881   fid=fopen(filename.data(),"a");
00882   if(fid==NULL)
00883     {printf("ERROR loading %s in write_off_type in Point_set\n",filename.data());exit(-1);}
00884 
00885   int k_vertex=0,N_vertex=size();
00886   for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00887     fprintf(fid,"%9.9f %9.9f %9.9f\n",(*this)(k_vertex,0),(*this)(k_vertex,1),(*this)(k_vertex,2));
00888 
00889   if(fclose(fid)!=0)
00890     {printf("ERROR closing %s in write_off_type in Point_set\n",filename.data());exit(-1);}
00891 
00892   return 0;
00893 }
00894 
00895 int Point_set::load_obj_file(const char* filename)
00896 {std::string file=filename;return load_obj_file(file);}
00897 int Point_set::load_obj_file(const std::string& filename)
00898 {
00899   destroy();
00900 
00901 #define SIZE_BUFFER 2048
00902   char buffer[SIZE_BUFFER]={'\0'};
00903   
00904   FILE *fid=NULL;
00905   fid=fopen(filename.data(),"r");
00906   if(fid==NULL)
00907     {printf("ERROR loading %s in load_obj_file in Point_set\n",filename.data());exit(-1);}
00908 
00909   float X[3];
00910   while(fscanf(fid,"%s",buffer)!=EOF)
00911     {
00912       if(strcmp(buffer,"v")==0)
00913         {
00914           if(fscanf(fid,"%f %f %f\n",X,X+1,X+2)!=3)
00915             {printf("Error reading vertices in load_obj_file in Point_set\n");exit(-1);}
00916           add_vertex(X[0],X[1],X[2]);
00917         }
00918       else //read the whole line
00919         fgets(buffer,sizeof(buffer),fid);
00920     }
00921 
00922 
00923   if(fclose(fid)!=0)
00924     {printf("ERROR closing %s in load_obj_file in Point_set\n",filename.data());exit(-1);}
00925   return 0;
00926 }
00927 
00928 
00929 int Point_set::write_obj_type(const char* filename) const
00930 {std::string file=filename;return write_obj_type(file);}
00931 int Point_set::write_obj_type(const std::string& filename) const
00932 {
00933   FILE *fid=NULL;
00934   fid=fopen(filename.data(),"a");
00935   if(fid==NULL)
00936     {printf("ERROR loading %s in write_obj_type in Point_set\n",filename.data());exit(-1);}
00937 
00938   int k_vertex=0,N_vertex=size();
00939   for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00940     fprintf(fid,"v %9.9f %9.9f %9.9f\n",(*this)(k_vertex,0),(*this)(k_vertex,1),(*this)(k_vertex,2));
00941 
00942   if(fclose(fid)!=0)
00943     {printf("ERROR closing %s in write_obj_type in Point_set\n",filename.data());exit(-1);}
00944 
00945   return 0;
00946 }
00947 
00948 
00949 
00950 
00951 //draw little cube for every vertex
00952 int Point_set::export_visible_off(const char* filename,double s_cube_size) const
00953 {std::string file=filename;return export_visible_off(file,s_cube_size);}
00954 int Point_set::export_visible_off(const std::string& filename,double s_cube_size) const
00955 {
00956   V_3D D=get_size_set();
00957   double d_max=D.get_max_of_coeff();
00958 
00959   double s_size=d_max/s_cube_size;
00960   
00961 
00962 
00963   FILE *fid=NULL;
00964   fid=fopen(filename.data(),"w");
00965   if(fid==NULL)
00966     {printf("ERROR loading %s in export_visible_off in Point_set\n",filename.data());exit(-1);}
00967 
00968 
00969   fprintf(fid,"#VISIBLE OFF SCENE %s\n",filename.data());
00970   fprintf(fid,"#N_vertex=%d\n",size());
00971   fprintf(fid,"OFF\n");
00972   fprintf(fid,"%d %d 0\n",8*size(),6*size());
00973 
00974   int k_vertex=0,N_vertex=size();
00975   V_3D current;
00976   for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00977     {
00978       current=get_vertex(k_vertex);
00979       fprintf(fid,"%9.9f %9.9f %9.9f\n",current[0]-s_size,current[1]-s_size,current[2]-s_size);
00980       fprintf(fid,"%9.9f %9.9f %9.9f\n",current[0]+s_size,current[1]-s_size,current[2]-s_size);
00981       fprintf(fid,"%9.9f %9.9f %9.9f\n",current[0]+s_size,current[1]+s_size,current[2]-s_size);
00982       fprintf(fid,"%9.9f %9.9f %9.9f\n",current[0]-s_size,current[1]+s_size,current[2]-s_size);
00983 
00984       fprintf(fid,"%9.9f %9.9f %9.9f\n",current[0]-s_size,current[1]-s_size,current[2]+s_size);
00985       fprintf(fid,"%9.9f %9.9f %9.9f\n",current[0]+s_size,current[1]-s_size,current[2]+s_size);
00986       fprintf(fid,"%9.9f %9.9f %9.9f\n",current[0]+s_size,current[1]+s_size,current[2]+s_size);
00987       fprintf(fid,"%9.9f %9.9f %9.9f\n",current[0]-s_size,current[1]+s_size,current[2]+s_size);
00988     }
00989   for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00990     {
00991       fprintf(fid,"4 %d %d %d %d\n",8*k_vertex+0,8*k_vertex+1,8*k_vertex+2,8*k_vertex+3);
00992       fprintf(fid,"4 %d %d %d %d\n",8*k_vertex+1,8*k_vertex+5,8*k_vertex+6,8*k_vertex+2);
00993       fprintf(fid,"4 %d %d %d %d\n",8*k_vertex+5,8*k_vertex+4,8*k_vertex+7,8*k_vertex+6);
00994       fprintf(fid,"4 %d %d %d %d\n",8*k_vertex+4,8*k_vertex+0,8*k_vertex+3,8*k_vertex+7);
00995       fprintf(fid,"4 %d %d %d %d\n",8*k_vertex+2,8*k_vertex+6,8*k_vertex+7,8*k_vertex+3);
00996       fprintf(fid,"4 %d %d %d %d\n",8*k_vertex+0,8*k_vertex+4,8*k_vertex+5,8*k_vertex+1);
00997     }
00998   
00999   fprintf(fid,"#EOF [OK] %s\n",filename.data());
01000   if(fclose(fid)!=0)
01001     {printf("ERROR closing %s in export_visible_off in Point_set\n",filename.data());exit(-1);}
01002 
01003 
01004   return 0;
01005 }
01006 
01007 
01008 
01009 int Point_set::load_g_file(const char* filename)
01010 {std::string file=filename;return load_g_file(file);}
01011 int Point_set::load_g_file(const std::string& filename)
01012 {
01013    destroy();
01014 
01015 #define SIZE_BUFFER 2048
01016   char buffer[SIZE_BUFFER]={'\0'};
01017   
01018   FILE *fid=NULL;
01019   fid=fopen(filename.data(),"r");
01020   if(fid==NULL)
01021     {printf("ERROR loading %s in load_g_file in Point_set\n",filename.data());exit(-1);}
01022 
01023 
01024 
01025 
01026 
01027   //pass comments
01028   fscanf(fid,"%s",buffer);
01029   while(buffer[0]=='#')//comments
01030     {
01031       fgets(buffer,sizeof(buffer),fid);
01032       fscanf(fid,"%s",buffer);
01033     }
01034 
01035 
01036   //read Number of vertices
01037   int N_vertex=0;
01038   int k_vertex=0;
01039   N_vertex=atoi(buffer);//N_vertex
01040   fgets(buffer,sizeof(buffer),fid);//read line
01041 
01042   float X[3]={0.0,0.0,0.0};
01043   while(k_vertex<N_vertex)
01044     {
01045       if(fscanf(fid,"%f %f %f",X,X+1,X+2)!=3)
01046         {
01047           fscanf(fid,"%s",buffer);
01048           if(buffer[0]!='#')
01049             {printf("ERROR loading %s in Point_set\n",filename.data());exit(-1);}
01050           else//read line
01051             fgets(buffer,sizeof(buffer),fid);
01052         }
01053       else
01054         {
01055           add_vertex(X[0],X[1],X[2]);
01056           k_vertex++;
01057         }
01058     }
01059 
01060 
01061   if(fclose(fid)!=0)
01062     {printf("ERROR closing %s in load_obj_file in Point_set\n",filename.data());exit(-1);}
01063  
01064   return 0;
01065 }
01066 
01067 
01068 int Point_set::load_collada_file(const char* filename)
01069 {std::string file=filename;return load_collada_file(file);}
01070 int Point_set::load_collada_file(const std::string& filename)
01071 {return load_collada_file(filename,"_ALL_");}
01072 
01073 // Load vertices starting with node positionned at geometry entry
01074 int Point_set::load_collada_mesh_vertices(TiXmlNode* geometry_node,const std::string& filename)
01075 {
01076 
01077   TiXmlNode *mesh_node=NULL;
01078   mesh_node=geometry_node->FirstChild("mesh");
01079   
01080   //need to find mesh
01081   if(mesh_node==NULL)
01082     {printf("Error in Point_set in load_collada_mesh_connectivity for file %s\n",filename.data());exit(-1);}
01083 
01084   
01085   //then try to find position array
01086   TiXmlElement *mesh_source_root=NULL;
01087   TiXmlElement *mesh_source=NULL;
01088   mesh_source=mesh_node->FirstChild("source")->ToElement();
01089   mesh_source_root=mesh_source;
01090   if(mesh_source==NULL)
01091     {printf("Error, no <source> entry in <mesh> in load_collada_mesh_vertices in Point_set in file %s\n",filename.data());exit(-1);}
01092 
01093   std::string name_attribute;
01094   do
01095     {
01096       if(mesh_source->Attribute("name")!=NULL)
01097         name_attribute = mesh_source->Attribute("name");
01098       if(name_attribute!="position")
01099         mesh_source = mesh_source->NextSiblingElement("source");
01100     }while(mesh_source!=NULL && name_attribute!="position");
01101 
01102   if(name_attribute!="position")
01103     {
01104       //might try to find [name]-positions in id
01105       std::string extension_to_find="positions";
01106       mesh_source=mesh_source_root;
01107       do
01108         {
01109           if(mesh_source->Attribute("id")!=NULL)
01110             name_attribute = mesh_source->Attribute("id");
01111           if(name_attribute.find(extension_to_find)!=std::string::npos)
01112             mesh_source->NextSiblingElement("source");    
01113         }while(mesh_source!=NULL && name_attribute.find(extension_to_find)==std::string::npos);
01114 
01115 
01116       if(name_attribute.find(extension_to_find)==std::string::npos)
01117         {printf("Error cannot find positions in <mesh><source> in load_collada_mesh_vertices in Point_set in file %s\n",filename.data());exit(-1);}
01118       //else find [something]positions
01119     }
01120 
01121   //load_float_array
01122   std::vector <double> position;
01123   position = load_collada_float_array(mesh_source,filename);
01124 
01125   //add the vertex
01126   return add_vertex(position);
01127 }
01128 
01129 int Point_set::load_collada_file(const char* filename,const char* name)
01130 {std::string file=filename;std::string mesh_name=name;return load_collada_file(file,mesh_name);}
01131 int Point_set::load_collada_file(const std::string& filename,const std::string& name)
01132 {
01133   TiXmlDocument doc(filename);
01134   if(!doc.LoadFile())
01135     {
01136       printf("ERROR opening %s\n",filename.data());
01137       cerr << "error #" << doc.ErrorId() << " : " << doc.ErrorDesc() << endl;
01138       exit(-1);
01139     }
01140 
01141 
01142   //find library_geometries
01143   TiXmlHandle root(doc.RootElement());
01144   TiXmlNode *lib_geometry=NULL;lib_geometry=root.ToNode();
01145   if(lib_geometry==NULL)
01146     {printf("Error reading file %s in load_collada_file in Point_set\n",filename.data());exit(-1);}
01147 
01148 
01149   //go to library_geometries entry
01150   lib_geometry = lib_geometry->FirstChild("library_geometries");
01151 
01152   if(lib_geometry==NULL)
01153     {printf("Error in file %s, cannot find library_geometries in load_collada_file in Point_set\n",filename.data());exit(-1);}
01154   
01155   
01156   //load all geometries
01157   TiXmlNode *geometry=NULL;
01158   geometry=lib_geometry->FirstChild("geometry");
01159   if(geometry==NULL)
01160     {printf("Error cannot find geometry in file %s in load_collada_file in Point_set\n",filename.data());exit(-1);}
01161   
01162 
01163   std::string geometry_id;
01164   int is_find=0;
01165   do
01166     {
01167       if(geometry->ToElement()->Attribute("id")==NULL)
01168         {printf("Error in file %s, geometry does not have id \n",filename.data());exit(-1);}
01169       geometry_id = geometry->ToElement()->Attribute("id");
01170       if(geometry_id==name || name=="_ALL_")
01171         {
01172           load_collada_mesh_vertices(geometry,filename);
01173           if(name!="_ALL_")
01174             is_find=1;
01175         }
01176       geometry=geometry->NextSiblingElement("geometry");
01177     }while(geometry!=NULL && is_find==0);
01178   
01179 
01180 
01181   if(is_find==0 && name!="_ALL_")
01182     {printf("Error in file %s, no geometry found to load Point_set with id=\"%s\"\n",filename.data(),name.data());exit(-1);}
01183 
01184   return 0; 
01185 }
01186 
01187 
01188 
01189 
01190 std::vector <double> Point_set::load_collada_float_array(TiXmlNode *mesh_source,const std::string& filename)
01191 {
01192   TiXmlElement *float_array_node=NULL;
01193   float_array_node = mesh_source->FirstChild("float_array")->ToElement();
01194   if(float_array_node==NULL)
01195     {printf("Error cannot find float_array in load_collada_float_array in Point_set in file %s\n",filename.data());exit(-1);}
01196   
01197   int count=0;
01198   float_array_node->QueryIntAttribute("count",&count);
01199   if(float_array_node->FirstChild()==NULL)
01200     {printf("Error in load_collada_float_array in Point_set in file %s\n",filename.data());exit(-1);}
01201   std::string full_array = float_array_node->FirstChild()->ToText()->ValueStr();
01202 
01203   //fill vector array
01204   std::vector <double> array;
01205   int c=0,k1=0,k0=0;
01206   string X;
01207   for(c=0;c<count;c++)
01208     {
01209       k1= full_array.find(" ",k1+1);
01210       X = full_array.substr(k0,k1-k0);
01211       array.push_back(atof(X.data())); //add vertex
01212       k0=k1+1;
01213     }
01214 
01215   return array;
01216 }
01217 
01218 int Point_set::unitize_size()
01219 {
01220   double max_size = get_size_set().get_max_of_coeff();
01221   if(fabs(max_size)<0.00001)
01222     {printf("Error in unitize size in Point_set\n");exit(-1);}
01223   return scale(1.0/max_size);
01224 }
01225 
01226 V_3D Point_set::get_closest_vertex(const V_3D& center) const
01227 {return get_vertex_v3d(N_closest(center,1)[0]);}
01228 V_3D Point_set::get_closest_vertex(double x,double y,double z) const
01229 {return get_closest_vertex(V_3D(x,y,z));}
01230 V_3D Point_set::get_closest_vertex(const double *x) const
01231 {return get_closest_vertex(V_3D(x[0],x[1],x[2]));}
01232 
01233 
01234 
01235 int Point_set::write_g_type(const char* filename) const
01236 {return write_g_type(std::string(filename));}
01237 int Point_set::write_g_type(const std::string& filename) const
01238 {
01240   return write_off_type(filename);
01241 }

Generated on Mon Mar 30 16:55:54 2009 by  doxygen 1.5.6