| 24 | } |
| 25 | |
| 26 | int MeshGeometry::project_out_zero_dim() { |
| 27 | if (m_dim == 2) return -1; |
| 28 | assert(m_dim == 3); |
| 29 | const size_t num_vertices = get_num_vertices(); |
| 30 | MatrixFr vertices(num_vertices, m_dim); |
| 31 | std::copy(m_vertices.data(), m_vertices.data() + m_vertices.size(), |
| 32 | vertices.data()); |
| 33 | Vector3F max_coord = vertices.colwise().maxCoeff(); |
| 34 | Vector3F min_coord = vertices.colwise().minCoeff(); |
| 35 | |
| 36 | int zero_dim = -1; |
| 37 | for (size_t i=0; i<3; i++) { |
| 38 | if (max_coord[i] == min_coord[i]) { |
| 39 | zero_dim = i; |
| 40 | break; |
| 41 | } |
| 42 | } |
| 43 | |
| 44 | if (zero_dim == -1) return -1; |
| 45 | m_dim = 2; |
| 46 | m_vertices.resize(num_vertices * 2); |
| 47 | if (zero_dim == 0) { |
| 48 | // Drop X |
| 49 | //std::cout << "Removing X component" << std::endl; |
| 50 | for (size_t i=0; i<num_vertices; i++) { |
| 51 | m_vertices[i*2 ] = vertices.row(i)[1]; |
| 52 | m_vertices[i*2+1] = vertices.row(i)[2]; |
| 53 | } |
| 54 | } else if (zero_dim == 2) { |
| 55 | // Drop Z |
| 56 | //std::cout << "Removing Z component" << std::endl; |
| 57 | for (size_t i=0; i<num_vertices; i++) { |
| 58 | m_vertices[i*2 ] = vertices.row(i)[0]; |
| 59 | m_vertices[i*2+1] = vertices.row(i)[1]; |
| 60 | } |
| 61 | } else { |
| 62 | // Drop Y |
| 63 | //std::cout << "Removing Y component" << std::endl; |
| 64 | for (size_t i=0; i<num_vertices; i++) { |
| 65 | m_vertices[i*2 ] = vertices.row(i)[0]; |
| 66 | m_vertices[i*2+1] = vertices.row(i)[2]; |
| 67 | } |
| 68 | } |
| 69 | return zero_dim; |
| 70 | } |
| 71 | |
| 72 | void MeshGeometry::extract_faces_from_tets() { |
| 73 | const VectorI& voxels = m_voxels; |
no test coverage detected