read_data(src_file, src_mesh, use_demean);
bool read_data(const std::string filename, Mesh& mesh, bool use_demean) { //将文件读到mesh中 bool read_OK = OpenMesh::IO::read_mesh(mesh, filename); std::cout << "filename = " << filename << std::endl; if (read_OK) { mesh.request_vertex_status(); mesh.request_edge_status(); mesh.request_face_status(); mesh.request_face_normals(); mesh.request_vertex_normals(); printBasicMeshInfo(mesh, use_demean); mesh.update_face_normals(); mesh.update_vertex_normals(); return true; } std::cout << "#vertices = " << mesh.n_vertices() << std::endl; return false; }printBasicMeshInfo()中更新点的坐标: M e s h S c a l e s = [ 1 n ∑ i = 0 N x i , 1 n ∑ i = 0 N y i , 1 n ∑ i = 0 N z i ] MeshScales=[\frac 1 n\sum_{\mathclap{i=0}}^N x_{i},\frac 1 n\sum_{\mathclap{i=0}}^N y_{i},\frac 1 n\sum_{\mathclap{i=0}}^N z_{i}] MeshScales=[n1i=0∑Nxi,n1i=0∑Nyi,n1i=0∑Nzi] V i ′ = V i − M e s h S c a l e s V_i'=V_i-MeshScales Vi′=Vi−MeshScales 即: V i ′ = [ x i , y i , z i ] − [ 1 n ∑ i = 0 N x i , 1 n ∑ i = 0 N y i , 1 n ∑ i = 0 N z i ] V_i'=[x_i,y_i,z_i]-[\frac 1 n\sum_{\mathclap{i=0}}^N x_{i},\frac 1 n\sum_{\mathclap{i=0}}^N y_{i},\frac 1 n\sum_{\mathclap{i=0}}^N z_{i}] Vi′=[xi,yi,zi]−[n1i=0∑Nxi,n1i=0∑Nyi,n1i=0∑Nzi]
void printBasicMeshInfo(Mesh& mesh, bool use_demean) { if (mesh.n_vertices() == 0) printf("No Mesh\n"); switch(checkMeshMode(mesh)) { case TRIANGLE: printf("Triangle Mesh.\n"); break; case QUAD: printf("Quadrilateral Mesh.\n"); break; default: printf("General Mesh.\n"); break; } printf("Information of the input mesh:\nVertex : %d;\nFace : %d;\nEdge : %d, HalfEdge : %d\n\n", mesh.n_vertices(),mesh.n_faces(),mesh.n_edges(),mesh.n_halfedges()); OpenMesh::Vec3d MeshScales; MeshScales[0] = 0.0; MeshScales[1] = 0.0; MeshScales[2] = 0.0; for (Mesh::VertexIter v_it = mesh.vertices_begin(); v_it != mesh.vertices_end(); ++v_it) { MeshScales += mesh.point(*v_it); } MeshScales /= mesh.n_vertices(); mesh.data(mesh.vertex_handle(0)).mesh_trans = MeshScales; if(use_demean) { for (Mesh::VertexIter v_it = mesh.vertices_begin(); v_it != mesh.vertices_end(); ++v_it) { mesh.point(*v_it) = mesh.point(*v_it)- MeshScales; } } }mesh_scaling()更新点的坐标: 找到src中最大的点 v m a x v_{max} vmax和最小的点 v m i n v_{min} vmin s c a l e = ∣ v m a x − v m i n ∣ scale=|v_{max}-v_{min}| scale=∣vmax−vmin∣ [ x i ′ , y i ′ , z i ′ ] = 1 s c a l e [ x i , y i , z i ] [x'_i,y'_i,z'_i]=\frac 1 {scale} [x_i,y_i,z_i] [xi′,yi′,zi′]=scale1[xi,yi,zi]
double mesh_scaling(Mesh& src_mesh, Mesh& tar_mesh) { OpenMesh::Vec3d max(-1e12, -1e12, -1e12); OpenMesh::Vec3d min(1e12, 1e12, 1e12); for(auto it = src_mesh.vertices_begin(); it != src_mesh.vertices_end(); it++) { for(int j = 0; j < 3; j++) { if(src_mesh.point(*it)[j] > max[j]) { max[j] = src_mesh.point(*it)[j]; } if(src_mesh.point(*it)[j] < min[j]) { min[j] = src_mesh.point(*it)[j]; } } } for(auto it = tar_mesh.vertices_begin(); it != tar_mesh.vertices_end(); it++) { for(int j = 0; j < 3; j++) { if(tar_mesh.point(*it)[j] > max[j]) { max[j] = tar_mesh.point(*it)[j]; } if(tar_mesh.point(*it)[j] < min[j]) { min[j] = tar_mesh.point(*it)[j]; } } } double scale = (max-min).norm(); for(auto it = src_mesh.vertices_begin(); it != src_mesh.vertices_end(); it++) { OpenMesh::Vec3d p = src_mesh.point(*it); p = p/scale; src_mesh.set_point(*it, p); } for(auto it = tar_mesh.vertices_begin(); it != tar_mesh.vertices_end(); it++) { OpenMesh::Vec3d p = tar_mesh.point(*it); p = p/scale; tar_mesh.set_point(*it, p); } return scale; }将src网格写到文件中去
if (use_demean) src_mesh.data(src_mesh.vertex_handle(0)).mesh_trans = tar_mesh.data(tar_mesh.vertex_handle(0)).mesh_trans; write_data(out_file.c_str(), src_mesh, use_demean, scale); std::cout << "write result to " << out_file << std::endl;bool write_data(const char* filename, Mesh& mesh, bool use_demean, double scale)
bool write_data(const char* filename, Mesh& mesh, bool use_demean, double scale) { OpenMesh::Vec3d MeshScales; MeshScales = mesh.data(mesh.vertex_handle(0)).mesh_trans; for (Mesh::VertexIter v_it = mesh.vertices_begin(); v_it != mesh.vertices_end(); ++v_it) { mesh.point(*v_it) = mesh.point(*v_it)*scale; } if(use_demean) { for (Mesh::VertexIter v_it = mesh.vertices_begin(); v_it != mesh.vertices_end(); ++v_it) { mesh.point(*v_it) = mesh.point(*v_it) + MeshScales; } } bool ok = OpenMesh::IO::write_mesh(mesh, filename); return ok; }