#pragma once #include "ThirdParty/Happly/happly.h" #include #include #include "ThirdParty/IsoSurfGen/TinyVector.h" #include class Mesh_Vis { public: Mesh_Vis(const std::string &plyfilename, const float sharp_angle_in_degree = 10) { std::string filenamewithoutext = plyfilename.substr(0, plyfilename.find_last_of(".")); happly::PLYData plyIn(plyfilename); std::vector> vertices = plyIn.getVertexPositions>(); std::vector> facets = plyIn.getFaceIndices(); const double cos_threshold = cos(sharp_angle_in_degree * M_PI / 180); std::vector> sharp_edges; std::vector> face_normals(facets.size()); #pragma omp parallel for for (ptrdiff_t i = 0; i < (ptrdiff_t)facets.size(); i++) { for (size_t k = 0; k < facets[i].size(); k++) { face_normals[i] += vertices[facets[i][k]].Cross(vertices[facets[i][(k + 1) % facets[i].size()]]); } face_normals[i].Normalize(); } std::map, std::vector> edge2facets; for (ptrdiff_t i = 0; i < (ptrdiff_t)facets.size(); i++) { for (size_t k = 0; k < facets[i].size(); k++) { auto v0 = facets[i][k], v1 = facets[i][(k + 1) % facets[i].size()]; if (v0 > v1) std::swap(v0, v1); edge2facets[std::make_pair(v0, v1)].push_back(i); } } std::vector vertex_tag(vertices.size(), false); for (const auto &e : edge2facets) { if (e.second.size() == 2 && fabs(face_normals[e.second[0]].Dot(face_normals[e.second[1]])) <= cos_threshold) { sharp_edges.push_back(e.first); vertex_tag[e.first.first] = true, vertex_tag[e.first.second] = true; } } std::string sharpedgefilename = filenamewithoutext + "_sharpedge" + ".obj"; std::ofstream edgestream(sharpedgefilename); std::vector vertex_indice(vertices.size(), -1); ptrdiff_t vcounter = 0; for (size_t i = 0; i < vertices.size(); i++) { if (vertex_tag[i]) { edgestream << "v " << vertices[i] << std::endl; vertex_indice[i] = vcounter; vcounter++; } } for (const auto &e : sharp_edges) { edgestream << "l " << vertex_indice[e.first] + 1 << ' ' << vertex_indice[e.second] + 1 << std::endl; } edgestream.close(); std::string meshlabprojname = filenamewithoutext + ".mlp"; std::ofstream mlpfile(meshlabprojname); mlpfile << "\r" << "\r" << "\r"; mlpfile << "\r"; mlpfile << "\r" << "1 0 0 0 \r" << "0 1 0 0 \r" << "0 0 1 0 \r" << "0 0 0 1 \r" << "\r"; mlpfile << "" << "100001000000000000000000000001010100000010100000000001111011110000001001" << "\r"; mlpfile << "\r"; mlpfile << "\r"; mlpfile << "\r" << "1 0 0 0 \r" << "0 1 0 0 \r" << "0 0 1 0 \r" << "0 0 0 1 \r" << "\r"; mlpfile << "" << "001001000000010000000100000001000100000010100000110100111011110000001001" << "\r"; mlpfile << "\r"; mlpfile << "\r" << "\r" << "\r"; mlpfile.close(); } };