| 109 | } |
| 110 | |
| 111 | MatrixIr MeshSeparator::flood(size_t seed, VectorI& sources) { |
| 112 | std::queue<size_t> Q; |
| 113 | Q.push(seed); |
| 114 | m_visited[seed] = true; |
| 115 | |
| 116 | std::list<size_t> element_list; |
| 117 | while (!Q.empty()) { |
| 118 | size_t ei = Q.front(); |
| 119 | Q.pop(); |
| 120 | element_list.push_back(ei); |
| 121 | |
| 122 | std::vector<size_t> neighbors = get_adjacent_element(ei); |
| 123 | for (size_t i=0; i<neighbors.size(); i++) { |
| 124 | size_t f_next = neighbors[i]; |
| 125 | if (m_visited[f_next]) continue; |
| 126 | Q.push(f_next); |
| 127 | m_visited[f_next] = true; |
| 128 | } |
| 129 | } |
| 130 | |
| 131 | const size_t vertex_per_element = m_elements.cols(); |
| 132 | MatrixIr comp(element_list.size(), vertex_per_element); |
| 133 | sources.resize(element_list.size()); |
| 134 | size_t count = 0; |
| 135 | for (std::list<size_t>::const_iterator itr = element_list.begin(); |
| 136 | itr != element_list.end(); itr++) { |
| 137 | assert(count < m_elements.rows()); |
| 138 | assert(*itr < m_elements.rows()); |
| 139 | comp.row(count) = m_elements.row(*itr); |
| 140 | sources[count] = *itr; |
| 141 | count++; |
| 142 | } |
| 143 | return comp; |
| 144 | } |
| 145 | |
| 146 | std::vector<size_t> MeshSeparator::get_adjacent_element(size_t index) { |
| 147 | std::vector<size_t> neighbors; |