| 43 | } |
| 44 | |
| 45 | void BoundaryEdges::extract_boundary(const Mesh& mesh) { |
| 46 | typedef Duplet Edge; |
| 47 | typedef DupletMap<size_t> EdgeFaceMap; |
| 48 | EdgeFaceMap edge_face_map; |
| 49 | |
| 50 | const size_t num_vertex_per_face = mesh.get_vertex_per_face(); |
| 51 | const size_t num_faces = mesh.get_num_faces(); |
| 52 | |
| 53 | for (size_t i=0; i<num_faces; i++) { |
| 54 | const VectorI face = mesh.get_face(i); |
| 55 | for (size_t j=0; j<num_vertex_per_face; j++) { |
| 56 | auto v0 = face[j]; |
| 57 | auto v1 = face[(j+1) % num_vertex_per_face]; |
| 58 | edge_face_map.insert({v0, v1}, i); |
| 59 | } |
| 60 | } |
| 61 | |
| 62 | std::vector<size_t> boundaries; |
| 63 | std::vector<size_t> boundary_faces; |
| 64 | for (EdgeFaceMap::const_iterator itr=edge_face_map.begin(); |
| 65 | itr != edge_face_map.end(); itr++) { |
| 66 | if (itr->second.size() == 1) { |
| 67 | boundaries.push_back(itr->first.get_ori_data()[0]); |
| 68 | boundaries.push_back(itr->first.get_ori_data()[1]); |
| 69 | boundary_faces.push_back(itr->second[0]); |
| 70 | } |
| 71 | } |
| 72 | |
| 73 | m_boundaries.resize(boundaries.size() / 2, 2); |
| 74 | std::copy(boundaries.begin(), boundaries.end(), m_boundaries.data()); |
| 75 | m_boundary_faces.resize(boundary_faces.size()); |
| 76 | std::copy(boundary_faces.begin(), boundary_faces.end(), |
| 77 | m_boundary_faces.data()); |
| 78 | } |
| 79 | |
| 80 | void BoundaryEdges::extract_boundary_nodes() { |
| 81 | size_t num_entries = m_boundaries.rows() * m_boundaries.cols(); |
nothing calls this directly
no test coverage detected