Mesh_object.cpp

Go to the documentation of this file.
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   //Just header
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   //write geometry
00229   point_set.write_g_type(filename);
00230   
00231   //write connectivity
00232   connectivity.write_g_type(filename);
00233 
00234 
00235 
00236   //write end
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   //Just header
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(&current_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   //OFF Header
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   //write geometry
00287   point_set.write_off_type(filename);
00288   
00289   //write connectivity
00290   connectivity.write_off_type(filename);
00291 
00292 
00293 
00294   //write end
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   // per polygon type
00338   parameters[0].resize_int(1);
00339   parameters[0].get_int(0).resize(1);
00340   parameters[0].get_int(0)[0]=1; //PER_POLYGON
00341 
00342   // fill polygon normals
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       //the first triangle is enough
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   //convert angle into degree
00373   if(angle_threshold>3.14159)
00374     angle_threshold = angle_threshold*3.14159/180.0;
00375 
00376   //first build one normal per polygon
00377   ok += build_normal_per_polygon();
00378 
00379   // second int vector will give the position
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       // integrated position in the vector for a direct access
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           //get polygon ring of this vertex
00404           polygon_ring=get_polygon_ring(k_polygon,k_vertex);
00405           ring_size=polygon_ring.size();
00406 
00407           //take the dot product between every normals of every polygon surrounding the current vertex
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           // if is a sharp edge, then copy the polygon normal for the vertex
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           // if is a smooth edge, then copy the smooth normal for the vertex
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   //replace the normal vector
00449   parameters[0].get_double(0) = normal_vector;
00450   parameters[0].get_int(0)[0]=3; //PER_VERTEX_AND_POLYGON
00451 
00452   return ok;
00453 }
00454 
00455 
00456 int Mesh_object::build_normal_per_vertex()
00457 {
00458   
00459   int ok=0;
00460 
00461   //first build one normal per polygon
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   //replace the normal vector
00487   parameters[0].get_double(0) = normal_vector;
00488   parameters[0].get_int(0)[0]=2; //PER_VERTEX
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   //Just the header
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(&current_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   //write geometry
00621   point_set.write_obj_type(filename);
00622 
00623   //write connectivity
00624   connectivity.write_obj_type(filename);
00625   
00626   //write end
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   // check the distance to every polygon
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   //check every intersection for every polygons
00770   //store the intersection in an unordered vector of Segment
00771   for(k_polygon=0;k_polygon<N_polygon;k_polygon++)
00772     {
00773       //check the intersection
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   // now order the segments in curve
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)//as long as there is segment to add
00793     {
00794       //check if there is at least one added segment during the whole pass
00795       is_addition=0;
00796 
00797       //add forward
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       //add back
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       //if there is no added segment, it might be non-connected cases
00818       if(is_addition==0)
00819         {
00820           // add this curve to the vector
00821           curves.push_back(current_curve);
00822           current_curve.destroy();
00823 
00824           //check if every segment has been added
00825           for(k_segment=0;is_addition==0 && k_segment<segment_number;k_segment++)
00826             if(is_segment_added[k_segment]==0)//Then add it in the next curve
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) //new polygon
00852         {
00853           add_vertex(polygon[k]);
00854           index_polygon.push_back(get_vertex_number()-1);
00855         }
00856       else //already exists
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   //cut every polygon
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)//add the polygon and build the connectivity
00884         new_mesh.add_unique_polygon(q);
00885       if(t!=0)//at least one polygon is cutted
00886         *type=1;
00887     }
00888 
00889 
00890   if(new_mesh.vertex_number()==0)//no more mesh at all
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   // set double size
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   // set per polygon type
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   // set double size
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   // set per polygon type
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   // set double size
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   // set per polygon type
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   //now fill the access index
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   //add the vertices
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   // build the connectivity
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   // build the index
01136   build_connectivity_index();
01137 
01138 
01139   return 0;
01140 
01141 }
01142 
01143 int Mesh_object::subdivide_mid_edge()
01144 {
01145   // create a new temp mesh
01146   Mesh_object mesh2;
01147 
01148   // just to save the order of the vertices
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   // now get every new polygons
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   //exchange the meshes
01168   (*this)=mesh2;
01169 
01170   return build_connectivity_index();
01171 }
01172 
01173 int Mesh_object::subdivide_barycenter_mid_edge()
01174 {
01175   // create a new temp mesh
01176   Mesh_object mesh2;
01177 
01178   // just to save the order of the vertices
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   // now get every new polygons
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   //exchange the meshes
01198   (*this)=mesh2;
01199 
01200   return build_connectivity_index();
01201 }
01202 
01203 int Mesh_object::subdivide_mixed_mid_edge()
01204 {
01205   // create a new temp mesh
01206   Mesh_object mesh2;
01207 
01208   // just to save the order of the vertices
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   // now get every new polygons
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) //if a triangle
01222         new_polygons = current.subdivide_mid_edge();
01223       else // not a triangle => barycenter
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   //exchange the meshes
01233   (*this)=mesh2;
01234 
01235   return build_connectivity_index();  
01236 }
01237 
01238 
01239 int Mesh_object::fast_subdivide_mid_edge()
01240 {
01241 
01242   //the subdivided Mesh
01243   Mesh_object mesh2;
01244   
01245   std::vector <int_vector> index_mid_point; //the index of the mid point
01246   std::vector <int_vector> already_existing_mid_point; //the already existing edges
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   //first add the old vertices
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   // record the mid_points first
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 )//edge does not exists yet
01277             {
01278               // add the order of the positioning of the mid_points
01279               index_mid_point[index_v0].add(index_v1);
01280               index_mid_point[index_v1].add(index_v0);
01281 
01282               // add the index in the vector
01283               already_existing_mid_point[index_v0].add(current_vertex);
01284               already_existing_mid_point[index_v1].add(current_vertex);
01285 
01286               // the grometrical mid_point
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       // the triangles/mid_edges-barycenter
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       //add the non triangular part linking every barycenters
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   //the subdivided Mesh
01346   Mesh_object mesh2;
01347   
01349   std::vector <int_vector> index_mid_point; //the index of the mid point
01350   std::vector <int_vector> already_existing_mid_point; //the already existing edges
01351   index_mid_point.resize(vertex_number());
01352   already_existing_mid_point.resize(vertex_number());
01353 
01354   //the index of the barycenter
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   //first add the old vertices
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   // record the mid_points first
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 )//edge does not exists yet
01387             {
01388               // add the order of the positioning of the mid_points
01389               index_mid_point[index_v0].add(index_v1);
01390               index_mid_point[index_v1].add(index_v0);
01391 
01392               // add the index in the vector
01393               already_existing_mid_point[index_v0].add(current_vertex);
01394               already_existing_mid_point[index_v1].add(current_vertex);
01395 
01396               // the geometrical mid_point
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   //2. Fill the new mesh with the connectivity
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       // the triangles/mid_edges-barycenter
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   //the subdivided Mesh
01459   Mesh_object mesh2;
01460   
01461   std::vector <int_vector> index_mid_point; //the index of the mid point
01462   std::vector <int_vector> already_existing_mid_point; //the already existing edges
01463   index_mid_point.resize(vertex_number());
01464   already_existing_mid_point.resize(vertex_number());
01465 
01466   //the index of the barycenter
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   //first add the old vertices
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   // record the mid_points first
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 )//edge does not exists yet
01499             {
01500               // add the order of the positioning of the mid_points
01501               index_mid_point[index_v0].add(index_v1);
01502               index_mid_point[index_v1].add(index_v0);
01503 
01504               // add the index in the vector
01505               already_existing_mid_point[index_v0].add(current_vertex);
01506               already_existing_mid_point[index_v1].add(current_vertex);
01507 
01508               // the geometrical mid_point
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   //2. Fill the new mesh with the connectivity
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       // the triangles/mid_edges-barycenter
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       //add the non triangular part linking every barycenters
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       //get barycenter of the one ring
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       // set x = x+lambda*Delta(x)
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   // set double size
01639   if(parameters[2].size_double()<1)
01640     parameters[2].resize_double(1);
01641   parameters[2].resize_double(0,0);
01642 
01643   // set per polygon type
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 // int Mesh_object::check_texture() const
01806 // {
01807 //   if(texture_type!=0)
01808 //     return -1;
01809 
01810 //   int N_texture_polygon=get_texture_polygon_number();
01811 //   int N_polygon=polygon_number();
01812 //   if(N_texture_polygon!=N_polygon)
01813 //     {prinntf("Failed in check_texture in Mesh_object: N_texture_polygon=%d, N_polygon=%d\n",N_texture_polygon,N_polygon);exit(-1);}
01814 
01815 //   int N_vertex_texture=parameters[2].get_double(0).size();
01816 //   for(int k=0;k<N_texture_polygon;k++)
01817 //     {
01818 //       int k_polygon_acess=get_polygon_access(k_polygon);
01819 //       int k_index = k_polygon_acess+k_vertex;
01820       
01821 //     }
01822 
01823 
01824 // }
01825 
01826 
01827 

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