| 151 | } |
| 152 | |
| 153 | void SimpleInflator::generate_joints() { |
| 154 | const size_t dim = m_wire_network->get_dim(); |
| 155 | const size_t num_vertices = m_wire_network->get_num_vertices(); |
| 156 | const size_t num_edges = m_wire_network->get_num_edges(); |
| 157 | const MatrixFr& vertices = m_wire_network->get_vertices(); |
| 158 | const MatrixIr& edges = m_wire_network->get_edges(); |
| 159 | const size_t loop_size = m_profile->size(); |
| 160 | |
| 161 | std::vector<std::vector<const MatrixFr*> > loops(num_vertices); |
| 162 | std::vector<std::vector<size_t> > source_edge_indices(num_vertices); |
| 163 | for (size_t i=0; i<num_edges; i++) { |
| 164 | const auto& end_loops = m_end_loops[i]; |
| 165 | const auto& edge = edges.row(i); |
| 166 | loops[edge[0]].push_back(&end_loops.first); |
| 167 | loops[edge[1]].push_back(&end_loops.second); |
| 168 | source_edge_indices[edge[0]].push_back(i); |
| 169 | source_edge_indices[edge[1]].push_back(i); |
| 170 | } |
| 171 | |
| 172 | for (size_t i=0; i<num_vertices; i++) { |
| 173 | const auto& incident_loops = loops[i]; |
| 174 | const auto& edge_ids = source_edge_indices[i]; |
| 175 | assert(incident_loops.size() == edge_ids.size()); |
| 176 | size_t valance = incident_loops.size(); |
| 177 | MatrixFr pts(valance * loop_size + 1, dim); |
| 178 | VectorI source_ids(pts.rows()); |
| 179 | pts.row(0) = vertices.row(i); |
| 180 | source_ids[0] = -1; |
| 181 | size_t count = 0; |
| 182 | for (auto loop : incident_loops) { |
| 183 | pts.block(count*loop_size+1, 0, loop_size, dim) = *loop; |
| 184 | source_ids.segment(count*loop_size+1, loop_size) = |
| 185 | VectorI::Ones(loop_size) * edge_ids[count]; |
| 186 | count++; |
| 187 | } |
| 188 | generate_joint(pts, source_ids, i); |
| 189 | } |
| 190 | } |
| 191 | |
| 192 | void SimpleInflator::connect_end_loops() { |
| 193 | const size_t dim = m_wire_network->get_dim(); |
nothing calls this directly
no test coverage detected