| 176 | } |
| 177 | |
| 178 | void ClipperEngine::extract_result(const ClipperLib::Paths& paths) { |
| 179 | std::list<Vector2F> vertices; |
| 180 | Loops loops; |
| 181 | size_t num_segments = 0; |
| 182 | for (const auto& path : paths) { |
| 183 | Loop loop = path_to_loop(path, vertices); |
| 184 | loops.push_back(loop); |
| 185 | num_segments += loop.size(); |
| 186 | } |
| 187 | |
| 188 | const size_t num_loop_vertices = vertices.size(); |
| 189 | MatrixFr loop_vertices(num_loop_vertices, 2); |
| 190 | size_t count = 0; |
| 191 | for (const auto& v : vertices) { |
| 192 | loop_vertices.row(count) = v; |
| 193 | count++; |
| 194 | } |
| 195 | |
| 196 | MatrixIr segments(num_segments, 2); |
| 197 | count = 0; |
| 198 | for (auto loop : loops) { |
| 199 | const size_t loop_size = loop.size(); |
| 200 | size_t i=0; |
| 201 | for (auto v_index : loop) { |
| 202 | const size_t curr_segment = count + i; |
| 203 | const size_t next_segment = count + (i+1)%loop_size; |
| 204 | segments.coeffRef(curr_segment, 1) = v_index; |
| 205 | segments.coeffRef(next_segment, 0) = v_index; |
| 206 | i++; |
| 207 | } |
| 208 | count+=loop_size; |
| 209 | } |
| 210 | |
| 211 | if (num_segments > 0) { |
| 212 | // Known issue: duplicated vertices from different loops cause triangle to crash. |
| 213 | ::remove_duplicated_vertices(loop_vertices, segments); |
| 214 | TriangleWrapper tri_wrapper; |
| 215 | tri_wrapper.set_points(loop_vertices); |
| 216 | tri_wrapper.set_segments(segments); |
| 217 | tri_wrapper.set_split_boundary(false); |
| 218 | tri_wrapper.set_auto_hole_detection(true); |
| 219 | tri_wrapper.set_max_num_steiner_points(0); |
| 220 | tri_wrapper.set_verbosity(0); |
| 221 | tri_wrapper.run(); |
| 222 | |
| 223 | m_vertices = tri_wrapper.get_vertices(); |
| 224 | m_faces = tri_wrapper.get_faces(); |
| 225 | } |
| 226 | } |
| 227 | |
| 228 | #endif |
nothing calls this directly
no test coverage detected