00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
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
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
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
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
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]=='#')
00812 fgets(buffer,sizeof(buffer),fid);
00813 }
00814 if(strcmp(buffer,"NOFF")==0)
00815 is_NOFF=1;
00816
00817
00818 fscanf(fid,"%s",buffer);
00819 while(buffer[0]=='#')
00820 {
00821 fgets(buffer,sizeof(buffer),fid);
00822 fscanf(fid,"%s",buffer);
00823 }
00824
00825
00826
00827 int N_vertex=0;
00828 int k_vertex=0;
00829 N_vertex=atoi(buffer);
00830 fgets(buffer,sizeof(buffer),fid);
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
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
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
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
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
01028 fscanf(fid,"%s",buffer);
01029 while(buffer[0]=='#')
01030 {
01031 fgets(buffer,sizeof(buffer),fid);
01032 fscanf(fid,"%s",buffer);
01033 }
01034
01035
01036
01037 int N_vertex=0;
01038 int k_vertex=0;
01039 N_vertex=atoi(buffer);
01040 fgets(buffer,sizeof(buffer),fid);
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
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
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
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
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
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
01119 }
01120
01121
01122 std::vector <double> position;
01123 position = load_collada_float_array(mesh_source,filename);
01124
01125
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
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
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
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
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()));
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 }