MCPcopy Create free account
hub / github.com/IfcOpenShell/IfcOpenShell / find_overlaps

Function find_overlaps

src/svgfill/src/arrange_polygons.cpp:301–349  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

299}
300
301std::set<std::pair<size_t, size_t>>
302find_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
351class DebugWriter {
352 public:

Callers 1

eliminate_overlapsFunction · 0.85

Calls 3

beginMethod · 0.45
endMethod · 0.45
insertMethod · 0.45

Tested by

no test coverage detected