From ad4502d96ed8be4ebe8f9b2e90688c3d44fc59c1 Mon Sep 17 00:00:00 2001 From: PavelMikus Date: Wed, 11 May 2022 15:32:46 +0200 Subject: [PATCH] implemented AABBTree version for lines --- src/libslic3r/AABBTreeLines.hpp | 22 ++++++ src/libslic3r/CMakeLists.txt | 2 - src/libslic3r/PolygonPointTest.cpp | 1 - src/libslic3r/PolygonPointTest.hpp | 90 ----------------------- src/libslic3r/SupportableIssuesSearch.cpp | 2 +- 5 files changed, 23 insertions(+), 94 deletions(-) delete mode 100644 src/libslic3r/PolygonPointTest.cpp delete mode 100644 src/libslic3r/PolygonPointTest.hpp diff --git a/src/libslic3r/AABBTreeLines.hpp b/src/libslic3r/AABBTreeLines.hpp index 7b9595419a..7eb7ab56a4 100644 --- a/src/libslic3r/AABBTreeLines.hpp +++ b/src/libslic3r/AABBTreeLines.hpp @@ -8,6 +8,28 @@ namespace Slic3r { + +struct EdgeGridWrapper { + EdgeGridWrapper(coord_t edge_width, std::vector lines) : + lines(lines), edge_width(edge_width) { + + grid.create(this->lines, edge_width, true); + grid.calculate_sdf(); + } + + bool signed_distance(const Point &point, coordf_t point_width, coordf_t &dist_out) const { + coordf_t tmp_dist_out; + bool found = grid.signed_distance(point, edge_width, tmp_dist_out); + dist_out = tmp_dist_out - edge_width / 2 - point_width / 2; + return found; + } + + EdgeGrid::Grid grid; + std::vector lines; + coord_t edge_width; +}; + + namespace AABBTreeLines { namespace detail { diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index 443c81b486..0a0062a754 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -201,8 +201,6 @@ set(SLIC3R_SOURCES Point.hpp Polygon.cpp Polygon.hpp - PolygonPointTest.cpp - PolygonPointTest.hpp MutablePolygon.cpp MutablePolygon.hpp PolygonTrimmer.cpp diff --git a/src/libslic3r/PolygonPointTest.cpp b/src/libslic3r/PolygonPointTest.cpp deleted file mode 100644 index dcab9e87eb..0000000000 --- a/src/libslic3r/PolygonPointTest.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "PolygonPointTest.hpp" diff --git a/src/libslic3r/PolygonPointTest.hpp b/src/libslic3r/PolygonPointTest.hpp deleted file mode 100644 index d95b191bf6..0000000000 --- a/src/libslic3r/PolygonPointTest.hpp +++ /dev/null @@ -1,90 +0,0 @@ -#ifndef SRC_LIBSLIC3R_POLYGONPOINTTEST_HPP_ -#define SRC_LIBSLIC3R_POLYGONPOINTTEST_HPP_ - -#include "libslic3r/Point.hpp" -#include "libslic3r/EdgeGrid.hpp" - -namespace Slic3r { - -struct EdgeGridWrapper { - EdgeGridWrapper(coord_t edge_width, std::vector lines) : - lines(lines), edge_width(edge_width) { - - grid.create(this->lines, edge_width, true); - grid.calculate_sdf(); - } - - bool signed_distance(const Point &point, coordf_t point_width, coordf_t &dist_out) const { - coordf_t tmp_dist_out; - bool found = grid.signed_distance(point, edge_width, tmp_dist_out); - dist_out = tmp_dist_out - edge_width / 2 - point_width / 2; - return found; - - } - - EdgeGrid::Grid grid; - std::vector lines; - coord_t edge_width; -}; - -namespace TODO { - -class PolygonPointTest { - - struct Segment { - coord_t start; - std::vector lines; - }; - - std::vector x_coord_segments; - -public: - PolygonPointTest(const ExPolygons &ex_polygons) { - std::vector lines; - for (const auto &exp : ex_polygons) { - Lines contour = exp.contour.lines(); - lines.insert(lines.end(), contour.begin(), contour.end()); - for (const auto &hole : exp.holes) { - Lines hole_lines = hole.lines(); - for (Line &line : hole_lines) { - line.reverse(); // reverse hole lines, so that we can use normal to deduce where the object is - } - lines.insert(lines.end(), hole_lines.begin(), hole_lines.end()); - } - } - - std::vector> sweeping_data(lines.size() * 2); - for (size_t line_index = 0; line_index < lines.size(); ++line_index) { - sweeping_data[line_index].first = line_index; - sweeping_data[line_index].second = true; - sweeping_data[line_index * 2 + 1].first = line_index; - sweeping_data[line_index * 2 + 1].second = false; - } - - const auto data_comparator = [&lines](const std::pair &left, - const std::pair &right) { - const auto left_x = - left.second ? - std::min(lines[left.first].a.x(), lines[left.first].b.x()) : - std::max(lines[left.first].a.x(), lines[left.first].b.x()); - const auto right_x = - right.second ? - std::min(lines[right.first].a.x(), lines[right.first].b.x()) : - std::max(lines[right.first].a.x(), lines[right.first].b.x()); - - return left_x < right_x; - }; - - std::sort(sweeping_data.begin(), sweeping_data.end(), data_comparator); - std::set active_lines; - - //TODO continue - - } - -}; -} - -} - -#endif /* SRC_LIBSLIC3R_POLYGONPOINTTEST_HPP_ */ diff --git a/src/libslic3r/SupportableIssuesSearch.cpp b/src/libslic3r/SupportableIssuesSearch.cpp index 5e3e1822de..d8ff5b7172 100644 --- a/src/libslic3r/SupportableIssuesSearch.cpp +++ b/src/libslic3r/SupportableIssuesSearch.cpp @@ -8,10 +8,10 @@ #include #include +#include "AABBTreeLines.hpp" #include "libslic3r/Layer.hpp" #include "libslic3r/ClipperUtils.hpp" #include "Geometry/ConvexHull.hpp" -#include "PolygonPointTest.hpp" #define DEBUG_FILES