| 299 | } |
| 300 | |
| 301 | std::set<std::pair<size_t, size_t>> |
| 302 | find_overlaps(const std::vector<Polygon_2>& polygons) { |
| 303 | typedef CGAL::Box_intersection_d::Box_with_handle_d<double, 2, size_t, CGAL::Box_intersection_d::ID_EXPLICIT> Box; |
| 304 | std::vector<Box> boxes; |
| 305 | |
| 306 | std::vector<std::vector<CGAL::Triangle_2<K>>> input_triangulated; |
| 307 | |
| 308 | for (auto it = polygons.begin(); it != polygons.end(); ++it) { |
| 309 | constexpr double offset = 1.e-3; |
| 310 | auto b = it->bbox(); |
| 311 | boxes.emplace_back( |
| 312 | CGAL::Bbox_2(b.xmin() - offset, b.ymin() - offset, b.xmax() + offset, b.ymax() + offset), |
| 313 | std::distance(polygons.begin(), it)); |
| 314 | |
| 315 | CGAL::Polygon_triangulation_decomposition_2<K> decompositor; |
| 316 | std::vector<Polygon_2> temp; |
| 317 | decompositor(*it, std::back_inserter(temp)); |
| 318 | input_triangulated.emplace_back(); |
| 319 | for (auto& pol : temp) { |
| 320 | auto it = pol.vertices_circulator(); |
| 321 | const auto& p = *(it++); |
| 322 | const auto& q = *(it++); |
| 323 | const auto& r = *(it++); |
| 324 | input_triangulated.back().emplace_back(p, q, r); |
| 325 | } |
| 326 | } |
| 327 | |
| 328 | std::set<std::pair<size_t, size_t>> overlaps; |
| 329 | |
| 330 | CGAL::box_self_intersection_d(boxes.begin(), boxes.end(), [&input_triangulated, &overlaps](const Box& a, const Box& b) { |
| 331 | for (auto& t1 : input_triangulated[a.handle()]) { |
| 332 | bool registered_overlap = false; |
| 333 | for (auto& t2 : input_triangulated[b.handle()]) { |
| 334 | if (CGAL::squared_distance(t1, t2) < (1.e-3 * 1.e-3)) { |
| 335 | overlaps.insert({(a.handle() < b.handle()) ? a.handle() : b.handle(), |
| 336 | (a.handle() < b.handle()) ? b.handle() : a.handle()}); |
| 337 | registered_overlap = true; |
| 338 | break; |
| 339 | } |
| 340 | } |
| 341 | if (registered_overlap) { |
| 342 | // no need to check other triangles |
| 343 | break; |
| 344 | } |
| 345 | } |
| 346 | }); |
| 347 | |
| 348 | return overlaps; |
| 349 | } |
| 350 | |
| 351 | class DebugWriter { |
| 352 | public: |
no test coverage detected