| 254 | } |
| 255 | |
| 256 | void MeshConnectivity::init_face_adjacencies(Mesh* mesh) { |
| 257 | if (face_adjacencies_computed()) return; |
| 258 | if (!vertex_adjacencies_computed()) |
| 259 | init_vertex_adjacencies(mesh); |
| 260 | |
| 261 | const size_t num_faces = mesh->get_num_faces(); |
| 262 | const size_t vertex_per_face = mesh->get_vertex_per_face(); |
| 263 | |
| 264 | std::vector<IndexSet> neighbor_faces(num_faces); |
| 265 | std::vector<IndexSet> neighbor_voxels(num_faces); |
| 266 | |
| 267 | for (size_t i=0; i<num_faces; i++) { |
| 268 | VectorI face = mesh->get_face(i); |
| 269 | IndexSet& face_neighbors = neighbor_faces[i]; |
| 270 | |
| 271 | assert(face.size() == vertex_per_face); |
| 272 | std::map<int, int> face_counter; |
| 273 | for (size_t j=0; j<vertex_per_face; j++) { |
| 274 | VectorI neighbors = get_vertex_adjacent_faces(face[j]); |
| 275 | size_t num_neighbors = neighbors.size(); |
| 276 | for (size_t k=0; k<num_neighbors; k++) { |
| 277 | if (face_counter.find(neighbors[k]) == face_counter.end()) { |
| 278 | face_counter[neighbors[k]] = 1; |
| 279 | } else { |
| 280 | face_counter[neighbors[k]] += 1; |
| 281 | } |
| 282 | } |
| 283 | } |
| 284 | for (std::map<int, int>::const_iterator itr = face_counter.begin(); |
| 285 | itr != face_counter.end(); itr++) { |
| 286 | if (itr->second == 2) { |
| 287 | face_neighbors.insert(itr->first); |
| 288 | } |
| 289 | } |
| 290 | } |
| 291 | |
| 292 | for (size_t i=0; i<num_faces; i++) { |
| 293 | VectorI face = mesh->get_face(i); |
| 294 | IndexSet& face_neighbors = neighbor_voxels[i]; |
| 295 | |
| 296 | std::map<int, int> voxel_counter; |
| 297 | for (size_t j=0; j<vertex_per_face; j++) { |
| 298 | VectorI neighbors = get_vertex_adjacent_voxels(face[j]); |
| 299 | size_t num_neighbors = neighbors.size(); |
| 300 | for (size_t k=0; k<num_neighbors; k++) { |
| 301 | if (voxel_counter.find(neighbors[k]) == voxel_counter.end()) { |
| 302 | voxel_counter[neighbors[k]] = 1; |
| 303 | } else { |
| 304 | voxel_counter[neighbors[k]] += 1; |
| 305 | } |
| 306 | } |
| 307 | } |
| 308 | for (std::map<int, int>::const_iterator itr = voxel_counter.begin(); |
| 309 | itr != voxel_counter.end(); itr++) { |
| 310 | if (itr->second == 3) { |
| 311 | face_neighbors.insert(itr->first); |
| 312 | } |
| 313 | } |
no test coverage detected