00001
00002 #include <Mesh_object.h>
00003
00004
00005 Mesh_object::Mesh_object()
00006 {name="NO_NAME";}
00007
00008 Mesh_object::~Mesh_object()
00009 {destroy();}
00010
00011 Mesh_object::Mesh_object(const Mesh_object& m)
00012 {
00013 connectivity = m.connectivity;
00014 point_set = m.point_set;
00015 parameters = m.parameters;
00016 name = m.name;
00017 }
00018
00019 int Mesh_object::destroy()
00020 {
00021 connectivity.destroy();
00022 point_set.destroy();
00023 parameters.resize(0);
00024 name="NO_NAME";
00025 return 0;
00026 }
00027
00028
00029 int Mesh_object::get_vertex_number() const
00030 {return point_set.size();}
00031 double& Mesh_object::get_vertex(int k_vertex,int k_dim)
00032 {return point_set(k_vertex,k_dim);}
00033 double& Mesh_object::get_vertex(int k_polygon,int k_vertex,int k_dim)
00034 {return point_set(connectivity(k_polygon,k_vertex),k_dim);}
00035 double Mesh_object::get_vertex(int k_vertex,int k_dim) const
00036 {return point_set(k_vertex,k_dim);}
00037 double Mesh_object::get_vertex(int k_polygon,int k_vertex,int k_dim) const
00038 {return point_set(connectivity(k_polygon,k_vertex),k_dim);}
00039 const double* Mesh_object::get_vertex_p(int k_vertex)
00040 {return point_set.get_vertex_p(k_vertex);}
00041 const double* Mesh_object::get_vertex_p(int k_polygon,int k_vertex)
00042 {return point_set.get_vertex_p(connectivity(k_polygon,k_vertex));}
00043 V_3D Mesh_object::get_vertex_v3d(int k_vertex) const
00044 {return point_set(k_vertex);}
00045 V_3D Mesh_object::get_vertex_v3d(int k_polygon,int k_vertex) const
00046 {return point_set(connectivity(k_polygon,k_vertex));}
00047
00048
00049 int Mesh_object::set_vertex(int k_vertex,double x,double y,double z)
00050 {return point_set.set_vertex(k_vertex,x,y,z);}
00051 int Mesh_object::set_vertex(int k_vertex,int k_dim,double value)
00052 {return point_set.set_vertex(k_vertex,k_dim,value);}
00053 int Mesh_object::set_vertex(int k_vertex,V_3D v)
00054 {return point_set.set_vertex(k_vertex,v);}
00055 int Mesh_object::set_vertex(int k_vertex,double* v)
00056 {return point_set.set_vertex(k_vertex,v);}
00057 int Mesh_object::set_vertex(int k_vertex,int dim,double *v)
00058 {return point_set.set_vertex(k_vertex,dim,v);}
00059 int Mesh_object::set_vertex(const Point_set& p)
00060 {return point_set.set_vertex(p);}
00061
00062
00063
00064 int Mesh_object::add_vertex(double x,double y,double z)
00065 {return point_set.add_vertex(x,y,z);}
00066 int Mesh_object::add_vertex(const V_3D& v)
00067 {return point_set.add_vertex(v);}
00068 int Mesh_object::add_vertex(const std::vector <double>& to_add)
00069 {return point_set.add_vertex(to_add);}
00070 int Mesh_object::add_vertex(const std::vector <V_3D>& to_add)
00071 {return point_set.add_vertex(to_add);}
00072 int Mesh_object::add_vertex(const double* v)
00073 {return point_set.add_vertex(v);}
00074 int Mesh_object::add_vertex(int dim,double *v)
00075 {return point_set.add_vertex(dim,v);}
00076 int Mesh_object::add_vertex(const Point_set& p)
00077 {return point_set.add_vertex(p);}
00078
00079
00080
00081
00082 int Mesh_object::add_unique(double x,double y,double z,double epsilon)
00083 {return point_set.add_unique(x,y,z,epsilon);}
00084 int Mesh_object::add_unique(const V_3D& v,double epsilon)
00085 {return point_set.add_unique(v,epsilon);}
00086 int Mesh_object::add_unique(const double* v,double epsilon)
00087 {return point_set.add_unique(v,epsilon);}
00088
00089 int Mesh_object::exist(const V_3D& v) const
00090 {return point_set.exist(v);}
00091 int Mesh_object::exist(const V_3D& v,double epsilon) const
00092 {return point_set.exist(v,epsilon);}
00093 int Mesh_object::exist(double x,double y,double z) const
00094 {return point_set.exist(x,y,z);}
00095 int Mesh_object::exist(double x,double y,double z,double epsilon) const
00096 {return point_set.exist(x,y,z,epsilon);}
00097
00098
00099 int Mesh_object::eliminate(int k_index)
00100 {return point_set.eliminate(k_index);}
00101 int Mesh_object::eliminate(const std::vector <int>& k_index)
00102 {return point_set.eliminate(k_index);}
00103 int Mesh_object::eliminate(const std::vector <double>& k_index)
00104 {return point_set.eliminate(k_index);}
00105 int Mesh_object::eliminate(double x,double y,double z)
00106 {return point_set.eliminate(x,y,z);}
00107 int Mesh_object::eliminate(double x,double y,double z,double epsilon)
00108 {return point_set.eliminate(x,y,z,epsilon);}
00109 int Mesh_object::eliminate(const V_3D& x,double epsilon)
00110 {return point_set.eliminate(x,epsilon);}
00111 int Mesh_object::eliminate(const V_3D& x)
00112 {return point_set.eliminate(x);}
00113 int Mesh_object::eliminate(const double* x,double epsilon)
00114 {return point_set.eliminate(x,epsilon);}
00115 int Mesh_object::eliminate(const double* x)
00116 {return point_set.eliminate(x);}
00117
00118
00119
00120
00121
00122 int Mesh_object::get_index(int k_index) const
00123 {return connectivity.get_index(k_index);}
00124 int& Mesh_object::get_index(int k_index)
00125 {return connectivity.get_index(k_index);}
00126 int Mesh_object::get_index(int k_polygon,int k_index) const
00127 {return connectivity.get_index(k_polygon,k_index);}
00128 int& Mesh_object::get_index(int k_polygon,int k_index)
00129 {return connectivity.get_index(k_polygon,k_index);}
00130 std::vector <int> Mesh_object::get_index_of_polygon(int k_polygon) const
00131 {return connectivity.get_index_of_polygon(k_polygon);}
00132 const int* Mesh_object::get_index() const
00133 {return connectivity.get_index();}
00134
00135
00136 int Mesh_object::size_index() const
00137 {return connectivity.size_index();}
00138 int Mesh_object::polygon_number() const
00139 {return connectivity.polygon_number();}
00140 int Mesh_object::polygon_size(int k_polygon) const
00141 {return connectivity.polygon_size(k_polygon);}
00142 int Mesh_object::vertex_number() const
00143 {return get_vertex_number();}
00144
00145
00146 int Mesh_object::get_index_triangulated(int k_index) const
00147 {return connectivity.get_index_triangulated(k_index);}
00148 int& Mesh_object::get_index_triangulated(int k_index)
00149 {return connectivity.get_index_triangulated(k_index);}
00150 int Mesh_object::get_index_triangulated(int k_triangle,int k_index) const
00151 {return connectivity.get_index_triangulated(k_triangle,k_index);}
00152 int& Mesh_object::get_index_triangulated(int k_triangle,int k_index)
00153 {return connectivity.get_index_triangulated(k_triangle,k_index);}
00154 const int* Mesh_object::get_index_triangulated() const
00155 {return connectivity.get_index_triangulated();}
00156 int Mesh_object::get_triangle_number() const
00157 {return connectivity.get_triangle_number();}
00158 int Mesh_object::find_polygon(const std::vector <int>& polygon) const
00159 {return connectivity.find_polygon(polygon);}
00160
00161
00162
00163 int Mesh_object::add_polygon(const std::vector <int>& polygon)
00164 {return connectivity.add_polygon(polygon);}
00165 int Mesh_object::add_polygon(int index_0,int index_1,int index_2,int index_3)
00166 {return connectivity.add_polygon(index_0,index_1,index_2,index_3);}
00167 int Mesh_object::add_polygon(int index_0,int index_1,int index_2)
00168 {return connectivity.add_polygon(index_0,index_1,index_2);}
00169 int Mesh_object::add_index(int index)
00170 {return connectivity.add_index(index);}
00171 int Mesh_object::set_polygon(int k_polygon,const std::vector <int>& polygon)
00172 {return connectivity.set_polygon(k_polygon,polygon);}
00173 int Mesh_object::set_index(int k_polygon,int k_index,int index)
00174 {return connectivity.set_index(k_polygon,k_index,index);}
00175 int Mesh_object::delete_polygon(int k_polygon)
00176 {return connectivity.delete_polygon(k_polygon);}
00177 int Mesh_object::delete_given_polygon(const std::vector <int> polygon)
00178 {return connectivity.delete_given_polygon(polygon);}
00179 int Mesh_object::flip_polygon(int k_polygon)
00180 {return connectivity.flip_polygon(k_polygon);}
00181 int Mesh_object::flip_polygon()
00182 {return connectivity.flip_polygon();}
00183
00184
00185
00186
00187 int Mesh_object::load_off_file(const char* filename)
00188 {return load_off_file(std::string(filename));}
00189 int Mesh_object::load_off_file(const std::string& filename)
00190 {
00191 int ok=0;
00192 ok += destroy();
00193 ok += point_set.load_off_file(filename);
00194 ok += connectivity.load_off_file(filename);
00195 return ok;
00196 }
00197
00198 int Mesh_object::load_g_file(const char* filename)
00199 {return load_g_file(std::string(filename));}
00200 int Mesh_object::load_g_file(const std::string& filename)
00201 {
00202 int ok=0;
00203 ok += destroy();
00204 ok += point_set.load_g_file(filename);
00205 ok += connectivity.load_g_file(filename);
00206 return ok;
00207 }
00208
00209 int Mesh_object::save_g_file(const char* filename) const
00210 {return save_g_file(std::string(filename));}
00211 int Mesh_object::save_g_file(const std::string& filename) const
00212 {
00213
00214 int ok=0;
00215 FILE *fid=NULL;
00216
00217 fid=fopen(filename.data(),"w");
00218 if(fid==NULL)
00219 {printf("ERROR loading %s in save_g_file in Mesh [%s]\n",filename.data(),name.data());exit(-1);}
00220
00221
00222 fprintf(fid,"%d %d\n",point_set.size(),connectivity.polygon_number());
00223
00224 if(fclose(fid)!=0)
00225 {printf("ERROR closing %s in write_off_file in Mesh [%s]\n",filename.data(),name.data());exit(-1);}
00226
00227
00228
00229 point_set.write_g_type(filename);
00230
00231
00232 connectivity.write_g_type(filename);
00233
00234
00235
00236
00237 fid=NULL;
00238 fid=fopen(filename.data(),"a");
00239 if(fid==NULL)
00240 {printf("ERROR loading %s in save_off_file in Mesh [%s]\n",filename.data(),name.data());exit(-1);}
00241
00242 fprintf(fid,"EOF Mesh Geometry %s [OK]\n",filename.data());
00243
00244 if(fclose(fid)!=0)
00245 {printf("ERROR closing %s in write_g_file in Mesh [%s]\n",filename.data(),name.data());exit(-1);}
00246
00247
00248 return ok;
00249
00250 }
00251
00252
00253
00254 int Mesh_object::save_off_file(const char* filename) const
00255 {return save_off_file(std::string(filename));}
00256 int Mesh_object::save_off_file(const std::string& filename) const
00257 {
00258 int ok=0;
00259 FILE *fid=NULL;
00260
00261 fid=fopen(filename.data(),"w");
00262 if(fid==NULL)
00263 {printf("ERROR loading %s in save_off_file in Mesh [%s]\n",filename.data(),name.data());exit(-1);}
00264
00265
00266
00267
00268 fprintf(fid,"# Geometrical Mesh [%s] in [%s]\n",name.data(),filename.data());
00269 time_t current_time=time(NULL);
00270 fprintf(fid,"# Mesh Exported on %s",asctime(localtime(¤t_time)));
00271 fprintf(fid,"#\n");
00272 fprintf(fid,"# N_vertices [%d]\n",point_set.size());
00273 fprintf(fid,"# N_polygons [%d]\n",connectivity.polygon_number());
00274 if(connectivity.edge_number()!=0)
00275 fprintf(fid,"# N_edges [%d]\n",connectivity.edge_number());
00276 fprintf(fid,"#\n");
00277
00278
00279 fprintf(fid,"OFF\n");
00280 fprintf(fid,"%d %d %d\n",point_set.size(),connectivity.polygon_number(),connectivity.edge_number());
00281
00282 if(fclose(fid)!=0)
00283 {printf("ERROR closing %s in write_off_file in Mesh [%s]\n",filename.data(),name.data());exit(-1);}
00284
00285
00286
00287 point_set.write_off_type(filename);
00288
00289
00290 connectivity.write_off_type(filename);
00291
00292
00293
00294
00295 fid=NULL;
00296 fid=fopen(filename.data(),"a");
00297 if(fid==NULL)
00298 {printf("ERROR loading %s in save_off_file in Mesh [%s]\n",filename.data(),name.data());exit(-1);}
00299
00300 fprintf(fid,"EOF Mesh Geometry %s [OK]\n",filename.data());
00301
00302 if(fclose(fid)!=0)
00303 {printf("ERROR closing %s in write_off_file in Mesh [%s]\n",filename.data(),name.data());exit(-1);}
00304
00305
00306 return ok;
00307
00308 }
00309
00310
00311 int Mesh_object::load_collada_file(const char* filename)
00312 {return load_collada_file(std::string(filename),std::string("_ALL_"));}
00313 int Mesh_object::load_collada_file(const std::string& filename)
00314 {return load_collada_file(filename,std::string("_ALL_"));}
00315 int Mesh_object::load_collada_file(const char* filename,const char* geometry_name)
00316 {return load_collada_file(std::string(filename),std::string(geometry_name));}
00317 int Mesh_object::load_collada_file(const std::string& filename,const std::string& geometry_name)
00318 {
00319 int ok=0;
00320 ok += destroy();
00321 ok += point_set.load_collada_file(filename,geometry_name);
00322 ok += connectivity.load_collada_file(filename,geometry_name);
00323 return ok;
00324 }
00325
00326
00327
00328
00329 int Mesh_object::build_normal_per_polygon()
00330 {
00331 if(parameters.size()<1)
00332 parameters.resize(1);
00333 parameters[0].destroy();
00334
00335 int N_polygons=polygon_number();
00336
00337
00338 parameters[0].resize_int(1);
00339 parameters[0].get_int(0).resize(1);
00340 parameters[0].get_int(0)[0]=1;
00341
00342
00343 parameters[0].resize_double(1);
00344 parameters[0].get_double(0).resize(3*N_polygons);
00345 int k_polygon=0;
00346 V_3D x0,x1,x2;
00347 V_3D n;
00348
00349 int k_dim=0;
00350 for(k_polygon=0;k_polygon<N_polygons;k_polygon++)
00351 {
00352
00353 x0=get_vertex_v3d(k_polygon,0);
00354 x1=get_vertex_v3d(k_polygon,1);
00355 x2=get_vertex_v3d(k_polygon,2);
00356
00357 n=((x1-x0).vector_prod(x2-x0)).normalized();
00358 for(k_dim=0;k_dim<3;k_dim++)
00359 parameters[0].get_double(0)[3*k_polygon+k_dim]=n[k_dim];
00360 }
00361
00362 return 0;
00363
00364 }
00365
00366
00367 int Mesh_object::build_normal_intermediate(double angle_threshold)
00368 {
00369
00370 int ok=0;
00371
00372
00373 if(angle_threshold>3.14159)
00374 angle_threshold = angle_threshold*3.14159/180.0;
00375
00376
00377 ok += build_normal_per_polygon();
00378
00379
00380 parameters[0].resize_int(2);
00381 parameters[0].get_int(1).resize(polygon_number());
00382
00383
00384
00385 int k_polygon=0,N_polygon=polygon_number();
00386 int k_vertex=0,N_vertex=0;
00387 V_3D n0,n1,normal,current_normal;
00388 int k_ring=0,k_ring_2=0,ring_size=0;
00389
00390 double_vector normal_vector;
00391 int_vector polygon_ring;
00392 int is_sharp_edge=0;
00393 int count=0;
00394 for(k_polygon=0;k_polygon<N_polygon;k_polygon++)
00395 {
00396
00397 parameters[0].get_int(1)[k_polygon] = count;
00398
00399 N_vertex=polygon_size(k_polygon);
00400 for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00401 {
00402
00403
00404 polygon_ring=get_polygon_ring(k_polygon,k_vertex);
00405 ring_size=polygon_ring.size();
00406
00407
00408 is_sharp_edge=0;
00409 for(k_ring=0;(is_sharp_edge==0) && (k_ring<ring_size);k_ring++)
00410 {
00411 n0=get_polygon_normal(polygon_ring[k_ring]);
00412 for(k_ring_2=k_ring+1;(is_sharp_edge==0) && (k_ring_2<ring_size);k_ring_2++)
00413 {
00414 n1=get_polygon_normal(polygon_ring[k_ring_2]);
00415
00416 if( n0.angle(n1)>angle_threshold )
00417 is_sharp_edge=1;
00418 }
00419 }
00420
00421
00422
00423 normal = get_polygon_normal(k_polygon);
00424 if(is_sharp_edge==1)
00425 {normal_vector.add(normal[0]);normal_vector.add(normal[1]);normal_vector.add(normal[2]);}
00426
00427
00428
00429 else
00430 {
00431
00432 normal.set(0.0,0.0,0.0);
00433 for(k_ring=0;k_ring<ring_size;k_ring++)
00434 {
00435 current_normal = get_polygon_normal(polygon_ring[k_ring]);
00436 normal += current_normal;
00437 }
00438 normal = normal.normalized();
00439 normal_vector.add(normal[0]);normal_vector.add(normal[1]);normal_vector.add(normal[2]);
00440 }
00441
00442
00443 count++;
00444 }
00445 }
00446
00447
00448
00449 parameters[0].get_double(0) = normal_vector;
00450 parameters[0].get_int(0)[0]=3;
00451
00452 return ok;
00453 }
00454
00455
00456 int Mesh_object::build_normal_per_vertex()
00457 {
00458
00459 int ok=0;
00460
00461
00462 ok += build_normal_per_polygon();
00463
00464 int k_ring=0,ring_size=0;
00465 int_vector polygon_ring;
00466 V_3D normal,n;
00467
00468 double_vector normal_vector;
00469 int k_vertex=0,N_vertex=vertex_number();
00470 for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00471 {
00472 polygon_ring = get_polygon_ring(k_vertex);
00473
00474 ring_size=polygon_ring.size();
00475 normal.set(0,0,0);
00476 for(k_ring=0;k_ring<ring_size;k_ring++)
00477 {
00478 n = get_polygon_normal(polygon_ring[k_ring]);
00479 normal += n;
00480 }
00481 normal = normal.normalized();
00482 normal_vector.add(normal[0]);normal_vector.add(normal[1]);normal_vector.add(normal[2]);
00483 }
00484
00485
00486
00487 parameters[0].get_double(0) = normal_vector;
00488 parameters[0].get_int(0)[0]=2;
00489
00490
00491
00492 return ok;
00493
00494 }
00495
00496
00497 int Mesh_object::normal_type() const
00498 {
00499 if(parameters.size()<1 || parameters[0].size_int()<1 || parameters[0].get_int(0).size()<1)
00500 return -1;
00501 else
00502 return parameters[0].get_int(0)[0];
00503 }
00504
00505 V_3D Mesh_object::get_polygon_normal(int k_polygon) const
00506 {
00507 if(normal_type()!=1 || parameters[0].get_double(0).size()!=3*polygon_number())
00508 {printf("Error in get_polygon_normal(%d), normal are not calculated for each polygons (type=%d)\n",k_polygon,normal_type());exit(-1);}
00509
00510 V_3D normal;
00511 for(int k_dim=0;k_dim<3;k_dim++)
00512 normal[k_dim]=parameters[0].get_double(0)[3*k_polygon+k_dim];
00513
00514 return normal;
00515 }
00516
00517 V_3D Mesh_object::get_polygon_and_vertex_normal(int k_polygon,int k_vertex) const
00518 {
00519 if(normal_type()!=3)
00520 {printf("Error in get_polygon_and_vertex_normal(%d,%d), normal are not calculated for each polygons_and_vertex (type=%d)\n",k_polygon,k_vertex,normal_type());exit(-1);}
00521 if(
00522 (parameters.size()<1) ||
00523 (parameters[0].size_int()<2) ||
00524 (parameters[0].get_int(1).size()<polygon_number())||
00525 (parameters[0].size_double()<1)
00526 )
00527 {printf("Error in get_polygon_and_vertex_normal(%d,%d), size are not correct\n",k_polygon,k_vertex);exit(-1);}
00528
00529
00530 int k_position=0;
00531 V_3D normal;
00532 k_position = parameters[0].get_int(1)[k_polygon]+k_vertex;
00533 for(int k_dim=0;k_dim<3;k_dim++)
00534 {
00535 if(3*k_position+2>=parameters[0].get_double(0).size())
00536 {printf("Error in get_polygon_and_vertex_normal(%d,%d), recored normal have size %d and not %d\n",k_polygon,k_vertex,parameters[0].get_double(0).size(),k_position);exit(-1);}
00537 normal[k_dim]=parameters[0].get_double(0)[3*k_position+k_dim];
00538 }
00539 return normal;
00540 }
00541 V_3D Mesh_object::get_vertex_normal(int k_vertex) const
00542 {
00543 if(normal_type()!=2 || parameters[0].get_double(0).size()!=3*vertex_number())
00544 {printf("Error in get_vertex_normal(%d), normal are not calculated for each vertex (type=%d)\n",k_vertex,normal_type());exit(-1);}
00545
00546
00547 V_3D normal;
00548 for(int k_dim=0;k_dim<3;k_dim++)
00549 normal[k_dim]=parameters[0].get_double(0)[3*k_vertex+k_dim];
00550
00551 return normal;
00552 }
00553 int Mesh_object::set_vertex_normal(int k_vertex,const V_3D& n)
00554 {
00555 if(normal_type()!=2 || parameters[0].get_double(0).size()!=3*vertex_number())
00556 {printf("Error in get_polygon_normal(%d), normal are not calculated for each polygons (type=%d)\n",k_vertex,normal_type());exit(-1);}
00557
00558
00559 for(int k_dim=0;k_dim<3;k_dim++)
00560 parameters[0].get_double(0)[3*k_vertex+k_dim]=n[k_dim];
00561
00562 return 0;
00563 }
00564
00565 V_3D Mesh_object::get_vertex_normal(int k_polygon,int k_vertex) const
00566 {int k_index=get_index(k_polygon,k_vertex);return get_vertex_normal(k_index);}
00567 int Mesh_object::set_vertex_normal(int k_polygon,int k_vertex,const V_3D& n)
00568 {int k_index=get_index(k_polygon,k_vertex);return set_vertex_normal(k_index,n);}
00569
00570
00571
00572 int_vector Mesh_object::get_one_ring(int k_polygon,int k_vertex) const
00573 {return connectivity.get_one_ring(k_polygon,k_vertex);}
00574 int_vector Mesh_object::get_one_ring(int k_vertex) const
00575 {return connectivity.get_one_ring(k_vertex);}
00576
00577 int_vector Mesh_object::get_polygon_ring(int k_polygon,int k_vertex) const
00578 {return connectivity.get_polygon_ring(k_polygon,k_vertex);}
00579 int_vector Mesh_object::get_polygon_ring(int k_vertex) const
00580 {return connectivity.get_polygon_ring(k_vertex);}
00581
00582 int Mesh_object::load_obj_file(const char* filename)
00583 {std::string file=filename;return load_obj_file(file);}
00584 int Mesh_object::load_obj_file(const std::string& filename)
00585 {
00586 int ok=0;
00587 ok += destroy();
00588 ok += point_set.load_obj_file(filename);
00589 ok += connectivity.load_obj_file(filename);
00590
00591 return ok;
00592 }
00593
00594 int Mesh_object::save_obj_file(const char* filename)
00595 {std::string file=filename;return save_obj_file(file);}
00596 int Mesh_object::save_obj_file(const std::string& filename)
00597 {
00598 int ok=0;
00599 FILE *fid=NULL;
00600
00601
00602 fid=fopen(filename.data(),"w");
00603 if(fid==NULL)
00604 {printf("ERROR loading %s in save_obj_type in Mesh [%s]\n",filename.data(),name.data());exit(-1);}
00605
00606 fprintf(fid,"# Geometrical Mesh [%s] in [%s]\n",name.data(),filename.data());
00607 time_t current_time=time(NULL);
00608 fprintf(fid,"# Mesh Exported on %s",asctime(localtime(¤t_time)));
00609 fprintf(fid,"#\n");
00610 fprintf(fid,"# N_vertices [%d]\n",point_set.size());
00611 fprintf(fid,"# N_polygons [%d]\n",connectivity.polygon_number());
00612 if(connectivity.edge_number()!=0)
00613 fprintf(fid,"# N_edges [%d]\n",connectivity.edge_number());
00614 fprintf(fid,"#\n");
00615
00616 if(fclose(fid)!=0)
00617 {printf("ERROR closing %s in write_off_type in Mesh [%s]\n",filename.data(),name.data());exit(-1);}
00618
00619
00620
00621 point_set.write_obj_type(filename);
00622
00623
00624 connectivity.write_obj_type(filename);
00625
00626
00627 fid=NULL;
00628 fid=fopen(filename.data(),"a");
00629 if(fid==NULL)
00630 {printf("ERROR loading %s in save_obj_type in Mesh [%s]\n",filename.data(),name.data());exit(-1);}
00631
00632 fprintf(fid,"EOF Mesh Geometry %s [OK]\n",filename.data());
00633
00634 if(fclose(fid)!=0)
00635 {printf("ERROR closing %s in write_obj_type in Mesh [%s]\n",filename.data(),name.data());exit(-1);}
00636
00637
00638 return ok;
00639 }
00640
00641
00642
00643
00644 int Mesh_object::matrix_transform(const Matrix& M)
00645 {return point_set.matrix_transform(M);}
00646
00647 int Mesh_object::rotate(const V_3D& n,double angle)
00648 {return point_set.rotate(n,angle);}
00649 int Mesh_object::rotate(double n_x,double n_y,double n_z,double angle)
00650 {return point_set.rotate(n_x,n_y,n_z,angle);}
00651 int Mesh_object::rotate(const double *n,double angle)
00652 {return point_set.rotate(n,angle);}
00653
00654
00655 int Mesh_object::rotate_centered(const V_3D& n,double angle)
00656 {return point_set.rotate_centered(n,angle);}
00657 int Mesh_object::rotate_centered(double n_x,double n_y,double n_z,double angle)
00658 {return point_set.rotate_centered(n_x,n_y,n_z,angle);}
00659 int Mesh_object::rotate_centered(const double *n,double angle)
00660 {return point_set.rotate_centered(n,angle);}
00661
00662 int Mesh_object::rotate(const V_3D& n,double angle,const V_3D& center)
00663 {return point_set.rotate(n,angle,center);}
00664 int Mesh_object::rotate(double n_x,double n_y,double n_z,double angle,const V_3D& center)
00665 {return point_set.rotate(n_x,n_y,n_z,angle,center);}
00666 int Mesh_object::rotate(const double *n,double angle,const V_3D& center)
00667 {return point_set.rotate(n,angle,center);}
00668
00669 int Mesh_object::translate(double t_x,double t_y,double t_z)
00670 {return point_set.translate(t_x,t_y,t_z);}
00671 int Mesh_object::translate(const double *t)
00672 {return point_set.translate(t);}
00673 int Mesh_object::translate(const V_3D& t)
00674 {return point_set.translate(t);}
00675
00676 int Mesh_object::scale(double s_x,double s_y,double s_z)
00677 {return point_set.scale(s_x,s_y,s_z);}
00678 int Mesh_object::scale(const double *s)
00679 {return point_set.scale(s);}
00680 int Mesh_object::scale(const V_3D& s)
00681 {return point_set.scale(s);}
00682 int Mesh_object::scale(double s)
00683 {return point_set.scale(s);}
00684
00685 int Mesh_object::scale_centered(double s_x,double s_y,double s_z)
00686 {return point_set.scale_centered(s_x,s_y,s_z);}
00687 int Mesh_object::scale_centered(const double *s)
00688 {return point_set.scale_centered(s);}
00689 int Mesh_object::scale_centered(const V_3D& s)
00690 {return point_set.scale_centered(s);}
00691 int Mesh_object::scale_centered(double s)
00692 {return point_set.scale_centered(s);}
00693
00694 double Mesh_object::get_closest_distance(double x,double y,double z,int *index) const
00695 {return point_set.get_closest_distance(x,y,z,index);}
00696 double Mesh_object::get_closest_distance(const double* x,int *index) const
00697 {return point_set.get_closest_distance(x,index);}
00698 double Mesh_object::get_closest_distance(const V_3D& x,int *index) const
00699 {return point_set.get_closest_distance(x,index);}
00700
00701 double Mesh_object::get_further_distance(double x,double y,double z,int *index) const
00702 {return point_set.get_further_distance(x,y,z,index);}
00703 double Mesh_object::get_further_distance(const double* x,int *index) const
00704 {return point_set.get_further_distance(x,index);}
00705 double Mesh_object::get_further_distance(const V_3D& x,int *index) const
00706 {return point_set.get_further_distance(x,index);}
00707
00708 double Mesh_object::distance_to_index(double x,double y,double z,int index) const
00709 {return point_set.distance_to_index(x,y,z,index);}
00710 double Mesh_object::distance_to_index(const double* x,int index) const
00711 {return point_set.distance_to_index(x,index);}
00712 double Mesh_object::distance_to_index(const V_3D& x,int index) const
00713 {return point_set.distance_to_index(x,index);}
00714
00715 std::vector <int> Mesh_object::N_closest(const V_3D& center,int _N_closest) const
00716 {return point_set.N_closest(center,_N_closest);}
00717 std::vector <int> Mesh_object::N_closest(double x,double y,double z,int _N_closest) const
00718 {return point_set.N_closest(x,y,z,_N_closest);}
00719 std::vector <int> Mesh_object::N_closest(double *x,int _N_closest) const
00720 {return point_set.N_closest(x,_N_closest);}
00721
00722
00723 Polygon Mesh_object::get_polygon(int k_polygon) const
00724 {
00725 if(k_polygon<0 || k_polygon>polygon_number())
00726 {printf("Error in get_polygon(%d) in Mesh_object, size=%d\n",k_polygon,polygon_number());exit(-1);}
00727
00728 std::vector <int> poly_index=get_index_of_polygon(k_polygon);
00729 std::vector <V_3D> poly_geom;
00730 for(int k=0;k<int(poly_index.size());k++)
00731 poly_geom.push_back(get_vertex_v3d(poly_index[k]));
00732
00733 Polygon P(poly_geom);
00734 return P;
00735 }
00736
00737 V_3D Mesh_object::closest_mesh_point(const V_3D& x) const
00738 {
00739
00740
00741 int k_polygon=0,N_polygon=polygon_number();
00742 double current_dist=0.0,min_dist=9999.9;
00743 V_3D closest_point;
00744
00745 Polygon current_polygon;
00746 for(k_polygon=0;k_polygon<N_polygon;k_polygon++)
00747 {
00748 current_polygon=get_polygon(k_polygon);
00749 current_dist=current_polygon.shortest_distance_to_point(x);
00750
00751 if(current_dist<min_dist)
00752 {
00753 min_dist=current_dist;
00754 closest_point=current_polygon.closest_point(x);
00755 }
00756 }
00757 return closest_point;
00758 }
00759
00760
00761
00762 std::vector <Curve_3D> Mesh_object::plane_intersection(const V_3D& n,const V_3D& x0) const
00763 {
00764 std::vector <Curve_3D> curves;
00765 int k_polygon=0,N_polygon=polygon_number();
00766
00767 std::vector <Segment> s;int type=-1;
00768 std::vector <V_3D> temp;
00769
00770
00771 for(k_polygon=0;k_polygon<N_polygon;k_polygon++)
00772 {
00773
00774 temp = get_polygon(k_polygon).plane_intersection(n,x0,&type);
00775 if(type==1 || type==3)
00776 s.push_back(Segment(temp[0],temp[1]));
00777 }
00778
00779 int segment_number=s.size();
00780
00781
00782
00783 std::vector <int> is_segment_added;
00784 is_segment_added.resize(segment_number);
00785
00786 Curve_3D current_curve;
00787 current_curve.add(s[0][0]);
00788 current_curve.add(s[0][1]);
00789 is_segment_added[0]=1;
00790
00791 int k_segment=-1,is_addition=1;
00792 while(is_addition==1)
00793 {
00794
00795 is_addition=0;
00796
00797
00798 for(k_segment=0;k_segment<segment_number;k_segment++)
00799 if(is_segment_added[k_segment]==0)
00800 {
00801 if(s[k_segment][0]==current_curve[current_curve.size()-1])
00802 {current_curve.add(s[k_segment][1]);is_segment_added[k_segment]=1;is_addition=1;}
00803 else if(s[k_segment][1]==current_curve[current_curve.size()-1])
00804 {current_curve.add(s[k_segment][0]);is_segment_added[k_segment]=1;is_addition=1;}
00805 }
00806
00807 for(k_segment=0;k_segment<segment_number;k_segment++)
00808 if(is_segment_added[k_segment]==0)
00809 {
00810 if(s[k_segment][0]==current_curve[0])
00811 {current_curve.add_first(s[k_segment][1]);is_segment_added[k_segment]=1;is_addition=1;}
00812 else if(s[k_segment][1]==current_curve[0])
00813 {current_curve.add_first(s[k_segment][0]);is_segment_added[k_segment]=1;is_addition=1;}
00814 }
00815
00816
00817
00818 if(is_addition==0)
00819 {
00820
00821 curves.push_back(current_curve);
00822 current_curve.destroy();
00823
00824
00825 for(k_segment=0;is_addition==0 && k_segment<segment_number;k_segment++)
00826 if(is_segment_added[k_segment]==0)
00827 {
00828 is_addition=1;
00829 current_curve.add(s[k_segment][0]);current_curve.add(s[k_segment][1]);
00830 is_segment_added[k_segment]=1;
00831 }
00832 }
00833 }
00834
00835
00836 return curves;
00837 }
00838
00839
00840 std::vector <int> Mesh_object::add_unique_polygon(const Polygon& polygon)
00841 {
00842
00843 int k=0;
00844 int N_polygon=polygon.size();
00845 int index=0;
00846 std::vector <int> index_polygon;
00847
00848 for(k=0;k<N_polygon;k++)
00849 {
00850 index = exist(polygon[k],0.00001);
00851 if(index==-1)
00852 {
00853 add_vertex(polygon[k]);
00854 index_polygon.push_back(get_vertex_number()-1);
00855 }
00856 else
00857 index_polygon.push_back(index);
00858 }
00859
00860 add_polygon(index_polygon);
00861 return index_polygon;
00862
00863 }
00864
00865
00866 Mesh_object Mesh_object::half_space_intersection(const V_3D& n,const V_3D& x0)
00867 {int type=0;return half_space_intersection(n,x0,&type);}
00868 Mesh_object Mesh_object::half_space_intersection(const V_3D& n,const V_3D& x0,int *type)
00869 {
00870 Mesh_object new_mesh;
00871 int k_polygon=0;
00872 int N_polygon=polygon_number();
00873
00874 *type = 0;
00875 Polygon p; int t=0;
00876 Polygon q;
00877
00878 for(k_polygon=0;k_polygon<N_polygon;k_polygon++)
00879 {
00880 p = get_polygon(k_polygon);
00881 q = p.half_space_intersection(n,x0,&t);
00882
00883 if(t!=2)
00884 new_mesh.add_unique_polygon(q);
00885 if(t!=0)
00886 *type=1;
00887 }
00888
00889
00890 if(new_mesh.vertex_number()==0)
00891 *type=2;
00892
00893 new_mesh.build_connectivity_index();
00894
00895 return new_mesh;
00896 }
00897
00898 int Mesh_object::build_connectivity_index()
00899 {return connectivity.build_all_index();}
00900
00901
00902 int Mesh_object::color_type() const
00903 {
00904 if(parameters.size()<2 || parameters[1].size_int()<1 || parameters[1].size_int(0)<1)
00905 return -1;
00906 else
00907 return parameters[1].get_int(0)[0];
00908 }
00909
00910 int Mesh_object::set_per_vertex_color()
00911 {
00912 if(parameters.size()<2)
00913 parameters.resize(2);
00914
00915
00916 if(parameters[1].size_double()<1)
00917 parameters[1].resize_double(1);
00918 if(parameters[1].size_double(0)!=4*vertex_number())
00919 parameters[1].resize_double(0,4*vertex_number());
00920
00921
00922 if(parameters[1].size_int()<1)
00923 parameters[1].resize_int(1);
00924 if(parameters[1].size_int(0)<1)
00925 parameters[1].resize_int(0,1);
00926
00927 parameters[1].get_int(0)[0]=1;
00928
00929
00930 return 0;
00931 }
00932 int Mesh_object::set_per_polygon_color()
00933 {
00934 if(parameters.size()<2)
00935 parameters.resize(2);
00936
00937
00938 if(parameters[1].size_double()<1)
00939 parameters[1].resize_double(1);
00940 if(parameters[1].size_double(0)!=4*polygon_number())
00941 parameters[1].resize_double(0,4*polygon_number());
00942
00943
00944 if(parameters[1].size_int()<1)
00945 parameters[1].resize_int(1);
00946 if(parameters[1].size_int(0)<1)
00947 parameters[1].resize_int(0,1);
00948
00949 parameters[1].get_int(0)[0]=2;
00950
00951
00952 return 0;
00953 }
00954
00955
00956 int Mesh_object::fill_color(double r,double g,double b,double t)
00957 {
00958 if(color_type()!=1 || parameters[1].size_double(0)!=4*vertex_number())
00959 set_per_vertex_color();
00960
00961 int k_vertex=0,N_vertex=vertex_number();
00962 for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
00963 {
00964 parameters[1].get_double(0)[4*k_vertex+0]=r;
00965 parameters[1].get_double(0)[4*k_vertex+1]=g;
00966 parameters[1].get_double(0)[4*k_vertex+2]=b;
00967 parameters[1].get_double(0)[4*k_vertex+3]=t;
00968
00969 }
00970 return 0;
00971 }
00972 int Mesh_object::set_per_vertex_color(int k_vertex,double r,double g,double b,double t)
00973 {
00974 if(color_type()!=1 || parameters[1].size_double(0)!=4*vertex_number())
00975 set_per_vertex_color();
00976
00977 parameters[1].get_double(0)[4*k_vertex+0]=r;
00978 parameters[1].get_double(0)[4*k_vertex+1]=g;
00979 parameters[1].get_double(0)[4*k_vertex+2]=b;
00980 parameters[1].get_double(0)[4*k_vertex+3]=t;
00981
00982 return 0;
00983 }
00984
00985 int Mesh_object::get_per_polygon_color(int k_polygon,double *r,double *g,double *b,double *t) const
00986 {
00987 if(color_type()!=2 || parameters[1].size_double(0)!=4*polygon_number())
00988 return -1;
00989 else
00990 {
00991 *r = parameters[1].get_double(0)[4*k_polygon+0];
00992 *g = parameters[1].get_double(0)[4*k_polygon+1];
00993 *b = parameters[1].get_double(0)[4*k_polygon+2];
00994 *t = parameters[1].get_double(0)[4*k_polygon+3];
00995 }
00996 return 0;
00997
00998 }
00999
01000 int Mesh_object::set_per_polygon_color(int k_polygon,double r,double g,double b,double t)
01001 {
01002 if(color_type()!=2 || parameters[1].size_double(0)!=4*polygon_number())
01003 set_per_polygon_color();
01004
01005 parameters[1].get_double(0)[4*k_polygon+0]=r;
01006 parameters[1].get_double(0)[4*k_polygon+1]=g;
01007 parameters[1].get_double(0)[4*k_polygon+2]=b;
01008 parameters[1].get_double(0)[4*k_polygon+3]=t;
01009
01010 return 0;
01011 }
01012
01013 int Mesh_object::get_per_vertex_color(int k_vertex,double *r,double *g,double *b,double *t) const
01014 {
01015 if(color_type()!=1 || parameters[1].size_double(0)!=4*vertex_number())
01016 return -1;
01017 else
01018 {
01019 *r = parameters[1].get_double(0)[4*k_vertex+0];
01020 *g = parameters[1].get_double(0)[4*k_vertex+1];
01021 *b = parameters[1].get_double(0)[4*k_vertex+2];
01022 *t = parameters[1].get_double(0)[4*k_vertex+3];
01023 }
01024 return 0;
01025 }
01026
01027 int Mesh_object::get_per_vertex_color(int k_polygon,int k_vertex,double *r,double *g,double *b,double *t) const
01028 {int index = get_index(k_polygon,k_vertex); return get_per_vertex_color(index,r,g,b,t);}
01029 int Mesh_object::set_per_vertex_color(int k_polygon,int k_vertex,double r,double g,double b,double t)
01030 {int index = get_index(k_polygon,k_vertex); return set_per_vertex_color(index,r,g,b,t);}
01031
01032
01033
01034 int Mesh_object::set_per_polygon_and_vertex_color()
01035 {
01036 if(parameters.size()<2)
01037 parameters.resize(2);
01038
01039
01040 if(parameters[1].size_double()<1)
01041 parameters[1].resize_double(1);
01042 if(parameters[1].size_double(0)!=4*polygon_number()*vertex_number())
01043 parameters[1].resize_double(0,4*polygon_number()*vertex_number());
01044
01045
01046 if(parameters[1].size_int()<2)
01047 parameters[1].resize_int(2);
01048 if(parameters[1].size_int(0)<1)
01049 parameters[1].resize_int(0,1);
01050
01051 parameters[1].get_int(0)[0]=3;
01052
01053
01054 if(parameters[1].size_int(1)<polygon_number())
01055 parameters[1].resize_int(1,polygon_number());
01056
01057
01058 int count=0;int N_polygon=polygon_number();
01059 for(int k_polygon=0;k_polygon<N_polygon;k_polygon++)
01060 {
01061 parameters[1].get_int(1)[k_polygon]=count;
01062 count+=polygon_size(k_polygon);
01063 }
01064
01065
01066 return 0;
01067 }
01068
01069 int Mesh_object::set_per_polygon_and_vertex_color(int k_polygon,int k_vertex,double r,double g,double b,double t)
01070 {
01071 if(color_type()!=3 || parameters[1].get_int(1).size()!=polygon_number() || parameters[1].get_double(0).size()!=4*vertex_number()*polygon_number())
01072 {set_per_polygon_and_vertex_color();}
01073
01074
01075 int k_position = parameters[1].get_int(1)[k_polygon]+k_vertex;
01076 if(4*k_position+3>=parameters[1].get_double(0).size())
01077 {printf("Error in set_per_polygon_and_vertex_color(%d,%d,%f,%f,%f,%f), size are not ok %d-%d\n",k_polygon,k_vertex,r,g,b,t,4*k_position+3,parameters[1].get_double(0).size());exit(-1);}
01078
01079 parameters[1].get_double(0,4*k_position+0)=r;
01080 parameters[1].get_double(0,4*k_position+1)=g;
01081 parameters[1].get_double(0,4*k_position+2)=b;
01082 parameters[1].get_double(0,4*k_position+3)=t;
01083
01084
01085
01086 return 0;
01087 }
01088
01089 int Mesh_object::get_per_polygon_and_vertex_color(int k_polygon,int k_vertex,double *r,double *g,double *b,double *t) const
01090 {
01091 if(color_type()!=3 || parameters[1].get_int(1).size()!=polygon_number() || parameters[1].get_double(0).size()!=4*vertex_number()*polygon_number())
01092 {printf("Error in set_per_polygon_and_vertex_color(%d,%d,...), size is not correct\n",k_polygon,k_vertex);exit(-1);}
01093
01094 int k_position = parameters[1].get_int(1)[k_polygon]+k_vertex;
01095 if(4*k_position+3>=parameters[1].get_double(0).size())
01096 {printf("Error in set_per_polygon_and_vertex_color(%d,%d,...), size is not ok %d-%d\n",k_polygon,k_vertex,4*k_position+3,parameters[1].get_double(0).size());exit(-1);}
01097
01098 *r = parameters[1].get_double(0,4*k_position+0);
01099 *g = parameters[1].get_double(0,4*k_position+1);
01100 *b = parameters[1].get_double(0,4*k_position+2);
01101 *t = parameters[1].get_double(0,4*k_position+3);
01102
01103 return 0;
01104 }
01105
01106 V_3D Mesh_object::get_middle_point() const {return point_set.get_middle_point();}
01107 V_3D Mesh_object::get_min_point() const {return point_set.get_min_point();}
01108 V_3D Mesh_object::get_max_point() const {return point_set.get_max_point();}
01109 V_3D Mesh_object::get_size_mesh() const {return point_set.get_size_set();}
01110 int Mesh_object::center_mesh() {return point_set.center_point_set();}
01111 int Mesh_object::unitize_size() {return point_set.unitize_size();}
01112
01113 int Mesh_object::set_name(const char* _name){name=_name;return 0;}
01114 int Mesh_object::set_name(const std::string& _name){name=_name;return 0;}
01115 std::string Mesh_object::get_name() const{return name;}
01116 std::string& Mesh_object::get_name() {return name;}
01117
01118 int Mesh_object::build_cube()
01119 {
01120 V_3D x0(0,0,0),x1(1,0,0),x2(1,1,0),x3(0,1,0),x4(0,0,1),x5(1,0,1),x6(1,1,1),x7(0,1,1);
01121 destroy();
01122
01123
01124 add_vertex(x0);add_vertex(x1);add_vertex(x2);add_vertex(x3);
01125 add_vertex(x4);add_vertex(x5);add_vertex(x6);add_vertex(x7);
01126
01127
01128 add_polygon(0,1,2,3);
01129 add_polygon(0,3,7,4);
01130 add_polygon(4,7,6,2);
01131 add_polygon(2,1,5,6);
01132 add_polygon(0,4,5,1);
01133 add_polygon(3,2,6,7);
01134
01135
01136 build_connectivity_index();
01137
01138
01139 return 0;
01140
01141 }
01142
01143 int Mesh_object::subdivide_mid_edge()
01144 {
01145
01146 Mesh_object mesh2;
01147
01148
01149 int N_vertex=vertex_number();
01150 for(int k=0;k<N_vertex;k++)
01151 mesh2.add_vertex(get_vertex_v3d(k));
01152
01153
01154 std::vector <Polygon> new_polygons;
01155 int N_polygon=polygon_number();
01156 int k=0,k2=0;int poly_size=0;
01157 for(k=0;k<N_polygon;k++)
01158 {
01159 new_polygons = get_polygon(k).subdivide_mid_edge();
01160 poly_size=new_polygons.size();
01161
01163 for(k2=0;k2<poly_size;k2++)
01164 mesh2.add_unique_polygon(new_polygons[k2]);
01165 }
01166
01167
01168 (*this)=mesh2;
01169
01170 return build_connectivity_index();
01171 }
01172
01173 int Mesh_object::subdivide_barycenter_mid_edge()
01174 {
01175
01176 Mesh_object mesh2;
01177
01178
01179 int N_vertex=vertex_number();
01180 for(int k=0;k<N_vertex;k++)
01181 mesh2.add_vertex(get_vertex_v3d(k));
01182
01183
01184 std::vector <Polygon> new_polygons;
01185 int N_polygon=polygon_number();
01186 int k=0,k2=0;int poly_size=0;
01187 for(k=0;k<N_polygon;k++)
01188 {
01189 new_polygons = get_polygon(k).subdivide_barycenter_mid_edge();
01190 poly_size=new_polygons.size();
01191
01193 for(k2=0;k2<poly_size;k2++)
01194 mesh2.add_unique_polygon(new_polygons[k2]);
01195 }
01196
01197
01198 (*this)=mesh2;
01199
01200 return build_connectivity_index();
01201 }
01202
01203 int Mesh_object::subdivide_mixed_mid_edge()
01204 {
01205
01206 Mesh_object mesh2;
01207
01208
01209 int N_vertex=vertex_number();
01210 for(int k=0;k<N_vertex;k++)
01211 mesh2.add_vertex(get_vertex_v3d(k));
01212
01213
01214 std::vector <Polygon> new_polygons;
01215 int N_polygon=polygon_number();
01216 int k=0,k2=0;int poly_size=0;
01217 Polygon current;
01218 for(k=0;k<N_polygon;k++)
01219 {
01220 current = get_polygon(k);
01221 if(current.size()==3)
01222 new_polygons = current.subdivide_mid_edge();
01223 else
01224 new_polygons = current.subdivide_barycenter_mid_edge();
01225 poly_size=new_polygons.size();
01226
01228 for(k2=0;k2<poly_size;k2++)
01229 mesh2.add_unique_polygon(new_polygons[k2]);
01230 }
01231
01232
01233 (*this)=mesh2;
01234
01235 return build_connectivity_index();
01236 }
01237
01238
01239 int Mesh_object::fast_subdivide_mid_edge()
01240 {
01241
01242
01243 Mesh_object mesh2;
01244
01245 std::vector <int_vector> index_mid_point;
01246 std::vector <int_vector> already_existing_mid_point;
01247 index_mid_point.resize(vertex_number());
01248 already_existing_mid_point.resize(vertex_number());
01249
01250 int k_polygon=0;
01251 int N_polygon=polygon_number();
01252 int size_polygon=0;
01253 int k_edge=0;
01254
01255 int index_v0=0,index_v1=0;
01256 int k_position_index=0;
01257
01258
01259
01260 int k_vertex=0,N_vertex=vertex_number();
01261 for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
01262 mesh2.add_vertex(get_vertex_v3d(k_vertex));
01263
01264
01265
01266 int current_vertex=vertex_number();
01267 for(k_polygon=0;k_polygon<N_polygon;k_polygon++)
01268 {
01269 size_polygon=polygon_size(k_polygon);
01270 for(k_edge=0;k_edge<size_polygon;k_edge++)
01271 {
01272 index_v0=get_index(k_polygon,k_edge);
01273 index_v1=get_index(k_polygon,(k_edge+1)%size_polygon);
01274
01275 k_position_index=index_mid_point[index_v0].exists(index_v1);
01276 if( k_position_index==-1 )
01277 {
01278
01279 index_mid_point[index_v0].add(index_v1);
01280 index_mid_point[index_v1].add(index_v0);
01281
01282
01283 already_existing_mid_point[index_v0].add(current_vertex);
01284 already_existing_mid_point[index_v1].add(current_vertex);
01285
01286
01287 mesh2.add_vertex(0.5*(get_vertex_v3d(index_v0)+get_vertex_v3d(index_v1)));
01288
01289 current_vertex++;
01290 }
01291 }
01292 }
01293
01294 int k_position_index2=0,index_mid2=0;
01295 int index_vm1=0;
01296 int index_mid=0;
01297 std::vector <int> temp_poly;
01298 for(k_polygon=0;k_polygon<N_polygon;k_polygon++)
01299 {
01300
01301 size_polygon=polygon_size(k_polygon);
01302 for(k_edge=0;k_edge<size_polygon;k_edge++)
01303 {
01304 index_v0 = get_index(k_polygon,k_edge);
01305 index_v1 = get_index(k_polygon,(k_edge+1)%size_polygon);
01306 index_vm1 = get_index(k_polygon,(k_edge-1>=0?k_edge-1:size_polygon-1));
01307
01308 k_position_index = index_mid_point[index_v0].exists(index_v1);
01309 k_position_index2 = index_mid_point[index_v0].exists(index_vm1);
01310
01311 index_mid = already_existing_mid_point[index_v0][k_position_index];
01312 index_mid2 = already_existing_mid_point[index_v0][k_position_index2];
01313
01314
01315 mesh2.add_polygon(index_v0,index_mid,index_mid2);
01316 }
01317
01318
01319 temp_poly.resize(0);
01320 for(k_edge=0;k_edge<size_polygon;k_edge++)
01321 {
01322 index_v0 = get_index(k_polygon,k_edge);
01323 index_v1 = get_index(k_polygon,(k_edge+1)%size_polygon);
01324
01325 k_position_index = index_mid_point[index_v0].exists(index_v1);
01326 index_mid=already_existing_mid_point[index_v0][k_position_index];
01327 temp_poly.push_back(index_mid);
01328 }
01329 mesh2.add_polygon(temp_poly);
01330 }
01331
01332
01333
01334 mesh2.build_connectivity_index();
01335 (*this)=mesh2;
01336 return 0;
01337
01338 }
01339
01340
01341 int Mesh_object::fast_subdivide_barycenter_mid_edge()
01342 {
01343
01344
01345
01346 Mesh_object mesh2;
01347
01349 std::vector <int_vector> index_mid_point;
01350 std::vector <int_vector> already_existing_mid_point;
01351 index_mid_point.resize(vertex_number());
01352 already_existing_mid_point.resize(vertex_number());
01353
01354
01355 int_vector barycenter_index;
01356 barycenter_index.resize(polygon_number());
01357
01358 int k_polygon=0;
01359 int N_polygon=polygon_number();
01360 int size_polygon=0;
01361 int k_edge=0;
01362
01363 int index_v0=0,index_v1=0;
01364 int k_position_index=0;
01365
01366
01367
01368 int k_vertex=0,N_vertex=vertex_number();
01369 for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
01370 mesh2.add_vertex(get_vertex_v3d(k_vertex));
01371
01372
01373
01374 int current_vertex=vertex_number();
01375 V_3D temp_barycenter;
01376 for(k_polygon=0;k_polygon<N_polygon;k_polygon++)
01377 {
01378 size_polygon=polygon_size(k_polygon);
01379 temp_barycenter.set(0,0,0);
01380 for(k_edge=0;k_edge<size_polygon;k_edge++)
01381 {
01382 index_v0=get_index(k_polygon,k_edge);
01383 index_v1=get_index(k_polygon,(k_edge+1)%size_polygon);
01384
01385 k_position_index=index_mid_point[index_v0].exists(index_v1);
01386 if( k_position_index==-1 )
01387 {
01388
01389 index_mid_point[index_v0].add(index_v1);
01390 index_mid_point[index_v1].add(index_v0);
01391
01392
01393 already_existing_mid_point[index_v0].add(current_vertex);
01394 already_existing_mid_point[index_v1].add(current_vertex);
01395
01396
01397 mesh2.add_vertex(0.5*(get_vertex_v3d(index_v0)+get_vertex_v3d(index_v1)));
01398
01399 current_vertex++;
01400 }
01401 temp_barycenter+=get_vertex_v3d(index_v0);
01402 }
01403
01404 temp_barycenter/=double(size_polygon);
01405 barycenter_index[k_polygon]=current_vertex;
01406 mesh2.add_vertex(temp_barycenter);
01407 current_vertex++;
01408 }
01409
01410
01411
01412
01413
01414
01415
01416 int k_position_index2=0,index_mid2=0;
01417 int index_vm1=0;
01418 int index_mid=0;
01419 int index_barycenter=0;
01420 for(k_polygon=0;k_polygon<N_polygon;k_polygon++)
01421 {
01422
01423 size_polygon=polygon_size(k_polygon);
01424 index_barycenter = barycenter_index[k_polygon];
01425 for(k_edge=0;k_edge<size_polygon;k_edge++)
01426 {
01427 index_v0 = get_index(k_polygon,k_edge);
01428 index_v1 = get_index(k_polygon,(k_edge+1)%size_polygon);
01429 index_vm1 = get_index(k_polygon,(k_edge-1>=0?k_edge-1:size_polygon-1));
01430
01431 k_position_index = index_mid_point[index_v0].exists(index_v1);
01432 k_position_index2 = index_mid_point[index_v0].exists(index_vm1);
01433
01434 index_mid = already_existing_mid_point[index_v0][k_position_index];
01435 index_mid2 = already_existing_mid_point[index_v0][k_position_index2];
01436
01437 mesh2.add_polygon(index_v0,index_mid,index_barycenter,index_mid2);
01438 }
01439 }
01440
01441
01442
01443 mesh2.build_connectivity_index();
01444 (*this)=mesh2;
01445 return 0;
01446
01447
01448
01449 }
01450
01451
01452
01453
01454 int Mesh_object::fast_subdivide_mixed_mid_edge()
01455 {
01456
01457
01458
01459 Mesh_object mesh2;
01460
01461 std::vector <int_vector> index_mid_point;
01462 std::vector <int_vector> already_existing_mid_point;
01463 index_mid_point.resize(vertex_number());
01464 already_existing_mid_point.resize(vertex_number());
01465
01466
01467 int_vector barycenter_index;
01468 barycenter_index.resize(polygon_number());
01469
01470 int k_polygon=0;
01471 int N_polygon=polygon_number();
01472 int size_polygon=0;
01473 int k_edge=0;
01474
01475 int index_v0=0,index_v1=0;
01476 int k_position_index=0;
01477
01478
01479
01480 int k_vertex=0,N_vertex=vertex_number();
01481 for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
01482 mesh2.add_vertex(get_vertex_v3d(k_vertex));
01483
01484
01485
01486 int current_vertex=vertex_number();
01487 V_3D temp_barycenter;
01488 for(k_polygon=0;k_polygon<N_polygon;k_polygon++)
01489 {
01490 size_polygon=polygon_size(k_polygon);
01491 temp_barycenter.set(0,0,0);
01492 for(k_edge=0;k_edge<size_polygon;k_edge++)
01493 {
01494 index_v0=get_index(k_polygon,k_edge);
01495 index_v1=get_index(k_polygon,(k_edge+1)%size_polygon);
01496
01497 k_position_index=index_mid_point[index_v0].exists(index_v1);
01498 if( k_position_index==-1 )
01499 {
01500
01501 index_mid_point[index_v0].add(index_v1);
01502 index_mid_point[index_v1].add(index_v0);
01503
01504
01505 already_existing_mid_point[index_v0].add(current_vertex);
01506 already_existing_mid_point[index_v1].add(current_vertex);
01507
01508
01509 mesh2.add_vertex(0.5*(get_vertex_v3d(index_v0)+get_vertex_v3d(index_v1)));
01510
01511 current_vertex++;
01512 }
01513
01514 temp_barycenter+=get_vertex_v3d(index_v0);
01515 }
01516
01517 temp_barycenter/=double(size_polygon);
01518 barycenter_index[k_polygon]=current_vertex;
01519 if(size_polygon!=3)
01520 {
01521 mesh2.add_vertex(temp_barycenter);
01522 current_vertex++;
01523 }
01524 }
01525
01526
01527
01528
01529
01530
01531
01532 int k_position_index2=0,index_mid2=0;
01533 int index_vm1=0;
01534 int index_mid=0;
01535 int index_barycenter=0;
01536 std::vector <int> temp_poly;
01537 for(k_polygon=0;k_polygon<N_polygon;k_polygon++)
01538 {
01539
01540 size_polygon=polygon_size(k_polygon);
01541 index_barycenter = barycenter_index[k_polygon];
01542 for(k_edge=0;k_edge<size_polygon;k_edge++)
01543 {
01544 index_v0 = get_index(k_polygon,k_edge);
01545 index_v1 = get_index(k_polygon,(k_edge+1)%size_polygon);
01546 index_vm1 = get_index(k_polygon,(k_edge-1>=0?k_edge-1:size_polygon-1));
01547
01548 k_position_index = index_mid_point[index_v0].exists(index_v1);
01549 k_position_index2 = index_mid_point[index_v0].exists(index_vm1);
01550
01551 index_mid = already_existing_mid_point[index_v0][k_position_index];
01552 index_mid2 = already_existing_mid_point[index_v0][k_position_index2];
01553
01554 if(size_polygon!=3)
01555 mesh2.add_polygon(index_v0,index_mid,index_barycenter,index_mid2);
01556 else
01557 mesh2.add_polygon(index_v0,index_mid,index_mid2);
01558 }
01559
01560
01561
01562 if(size_polygon==3)
01563 {
01564 temp_poly.resize(0);
01565 for(k_edge=0;k_edge<size_polygon;k_edge++)
01566 {
01567 index_v0 = get_index(k_polygon,k_edge);
01568 index_v1 = get_index(k_polygon,(k_edge+1)%size_polygon);
01569
01570 k_position_index = index_mid_point[index_v0].exists(index_v1);
01571 index_mid=already_existing_mid_point[index_v0][k_position_index];
01572 temp_poly.push_back(index_mid);
01573 }
01574 mesh2.add_polygon(temp_poly);
01575 }
01576
01577 }
01578
01579
01580
01581 mesh2.build_connectivity_index();
01582 (*this)=mesh2;
01583 return 0;
01584
01585
01586
01587 }
01588
01589
01590 int Mesh_object::Laplacien_smooth(double lambda)
01591 {
01592 int k_vertex=0;
01593 int N_vertex=vertex_number();
01594
01595 int_vector one_ring;
01596
01597 int k_one_ring=0;
01598 int N_one_ring=0;
01599 V_3D barycenter;
01600 V_3D x,u;
01601
01602 std::vector <V_3D> temp;
01603 for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
01604 {
01605
01606 barycenter.set(0,0,0);
01607 one_ring = get_one_ring(k_vertex);
01608 N_one_ring=one_ring.size();
01609 for(k_one_ring=0;k_one_ring<N_one_ring;k_one_ring++)
01610 barycenter+=get_vertex_v3d(one_ring[k_one_ring]);
01611 barycenter/=N_one_ring;
01612
01613
01614 x = get_vertex_v3d(k_vertex);
01615 u = barycenter-x;
01616 temp.push_back(x+lambda*u);
01617 }
01618 for(k_vertex=0;k_vertex<N_vertex;k_vertex++)
01619 set_vertex(k_vertex,temp[k_vertex]);
01620
01621
01622
01623 return 0;
01624 }
01625
01626
01627 int Mesh_object::triangulate()
01628 {return connectivity.triangulate();}
01629
01630
01631
01632
01633 int Mesh_object::set_intermediate_texture()
01634 {
01635 if(parameters.size()<3)
01636 parameters.resize(3);
01637
01638
01639 if(parameters[2].size_double()<1)
01640 parameters[2].resize_double(1);
01641 parameters[2].resize_double(0,0);
01642
01643
01644 if(parameters[2].size_int()<1)
01645 parameters[2].resize_int(3);
01646 if(parameters[2].size_int(0)<1)
01647 parameters[2].resize_int(0,1);
01648 parameters[2].resize_int(1,1);
01649 parameters[2].resize_int(2,0);
01650
01651 parameters[2].get_int(0)[0]=0;
01652 parameters[2].get_int(1)[0]=-1;
01653
01654
01655
01656 return 0;
01657 }
01658
01659
01660 int Mesh_object::texture_type() const
01661 {
01662 if(parameters.size()<3 || parameters[2].size_int()<1 || parameters[2].size_int(0)<1)
01663 return -1;
01664 else
01665 return parameters[2].get_int(0)[0];
01666 }
01667
01668 int Mesh_object::set_intermediate_texture(int k_polygon,int k_vertex,double t0,double t1)
01669 {
01670 if(k_vertex>=vertex_number() || k_polygon>=polygon_number())
01671 {printf("Error in set_texture, k_vertex(%d),k_polygon(%d) is too large(%d)(%d)\n",k_vertex,k_polygon,vertex_number(),polygon_number());exit(-1);}
01672
01673 if(texture_type()!=0)
01674 set_intermediate_texture();
01675
01676 int k_polygon_access=get_polygon_access(k_polygon);
01677 int k_index=k_polygon_access+k_vertex;
01678 if(k_index<0 || k_index>parameters[2].get_int(2).size())
01679 {printf("Error in set_intermediate_texture, k_index(%d) is wrong size(%d)\n",k_index,parameters[2].get_int(2).size());exit(-1);}
01680
01681 int k_double_index = parameters[2].get_int(2)[k_index];
01682
01683 parameters[2].get_double(0)[2*k_double_index+0]=t0;
01684 parameters[2].get_double(0)[2*k_double_index+1]=t1;
01685 return 0;
01686 }
01687
01688
01689 int Mesh_object::get_intermediate_texture(int k_polygon,int k_vertex,double* t0,double* t1) const
01690 {
01691 if(texture_type()!=0)
01692 return -1;
01693 if(k_vertex>=vertex_number() || k_polygon>=polygon_number())
01694 return -1;
01695
01696 int k_polygon_access=get_polygon_access(k_polygon);
01697 int k_index=k_polygon_access+k_vertex;
01698 if(k_index<0 || k_index>parameters[2].get_int(2).size())
01699 {printf("Error in get_intermediate_texture, k_index(%d) is wrong size(%d)\n",k_index,parameters[2].get_int(2).size());exit(-1);}
01700 int k_double_index = parameters[2].get_int(2)[k_index];
01701
01702
01703 if(2*k_double_index+0<0 || 2*k_double_index+1>parameters[2].get_double(0).size())
01704 {printf("Error in get_intermediate_texture in Mesh_object, texture_polygon %d in vertex %d has k_polyon_access %d, index %d, and array of texture has a size of %d\n",k_polygon,k_vertex,k_polygon_access,k_index,parameters[2].get_double(0).size()/2);exit(-1);}
01705
01706 *t0=parameters[2].get_double(0)[2*k_double_index+0];
01707 *t1=parameters[2].get_double(0)[2*k_double_index+1];
01708 return 0;
01709
01710 }
01711
01712 int Mesh_object::add_intermediate_texture(double t0,double t1)
01713 {
01714 if(texture_type()!=0)
01715 set_intermediate_texture();
01716
01717 parameters[2].get_double(0).add(t0);
01718 parameters[2].get_double(0).add(t1);
01719 return 0;
01720 }
01721 int Mesh_object::add_polygon_texture(const std::vector <int>& index)
01722 {
01723 if(texture_type()!=0)
01724 set_intermediate_texture();
01725
01726 parameters[2].get_int(2).add(index);
01727 parameters[2].get_int(2).add(-1);
01728 return 0;
01729 }
01730
01731 int Mesh_object::get_polygon_access(int k_polygon) const
01732 {return connectivity.get_polygon_access(k_polygon);}
01733
01734 int Mesh_object::get_texture_polygon_number() const
01735 {
01736 if(texture_type()!=0)
01737 return -1;
01738
01739 int polygon_count=0;
01740 int k=0;
01741 for(k=0;k<parameters[2].get_int(2).size();k++)
01742 if(parameters[2].get_int(2)[k]==-1)
01743 polygon_count++;
01744 return polygon_count;
01745 }
01746
01747 int Mesh_object::set_texture_number(int k_texture)
01748 {
01749 if(texture_type()!=0)
01750 set_intermediate_texture();
01751
01752 parameters[2].get_int(1)[0]=k_texture;
01753 return 0;
01754 }
01755 int Mesh_object::get_texture_number() const
01756 {
01757 if(texture_type()!=0)
01758 return -1;
01759
01760 return parameters[2].get_int(1)[0];
01761 }
01762
01763 int Mesh_object::build_manifold()
01764 {return connectivity.build_manifold();}
01765 int Mesh_object::build_edges()
01766 {return connectivity.build_edges();}
01767
01768
01769 Connectivity& Mesh_object::get_connectivity() {return connectivity;}
01770 const Connectivity& Mesh_object::get_connectivity() const {return connectivity;}
01771
01772
01773 int Mesh_object::increase_alpha(double d_alpha)
01774 {
01775 if(color_type()==-1)
01776 return -1;
01777
01778 int k=0;
01779 int N=parameters[1].get_double(0).size();
01780 double current_alpha=0.0;
01781 double new_alpha;
01782 for(k=3;k<N;k+=4)
01783 {
01784 current_alpha=parameters[1].get_double(0)[k];
01785 new_alpha = current_alpha+d_alpha;
01786 if(new_alpha>1.0)
01787 new_alpha=1.0;
01788 else if(new_alpha<0.0)
01789 new_alpha=0.0;
01790 parameters[1].get_double(0)[k]=new_alpha;
01791 }
01792 return 0;
01793 }
01794 int Mesh_object::decrease_alpha(double d_alpha)
01795 {return increase_alpha(-d_alpha);}
01796
01797 V_3D Mesh_object::get_closest_vertex(const V_3D& center) const
01798 {return point_set.get_closest_vertex(center);}
01799 V_3D Mesh_object::get_closest_vertex(double x,double y,double z) const
01800 {return point_set.get_closest_vertex(x,y,z);}
01801 V_3D Mesh_object::get_closest_vertex(const double *x) const
01802 {return point_set.get_closest_vertex(x);}
01803
01804
01805
01806
01807
01808
01809
01810
01811
01812
01813
01814
01815
01816
01817
01818
01819
01820
01821
01822
01823
01824
01825
01826
01827