OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::anonymous_namespace{MultiMaterialSegmentation.cpp}::IslandLocator Class Reference
Collaboration diagram for Slic3r::anonymous_namespace{MultiMaterialSegmentation.cpp}::IslandLocator:

Public Member Functions

 IslandLocator (const ExPolygons &islands)
void find (const ExPolygon &piece, std::vector< size_t > &out) const

Private Member Functions

template<typename Fn>
void for_cells (const BoundingBox &bb, Fn &&fn) const

Private Attributes

const ExPolygons & m_islands
std::vector< BoundingBox > m_bboxes
BoundingBox m_extent
coord_t m_cell_w = 1
coord_t m_cell_h = 1
std::vector< std::vector< size_t > > m_grid

Static Private Attributes

static constexpr int GRID = 64

Detailed Description

Constructor & Destructor Documentation

◆ IslandLocator()

Slic3r::anonymous_namespace{MultiMaterialSegmentation.cpp}::IslandLocator::IslandLocator ( const ExPolygons & islands)
inlineexplicit
1943 : m_islands(islands)
1944 {
1945 m_bboxes.reserve(islands.size());
1946 for (const ExPolygon &island : islands) {
1947 m_bboxes.emplace_back(get_extents(island));
1948 m_extent.merge(m_bboxes.back());
1949 }
1950 if (!m_extent.defined)
1951 return;
1952 const Point size = m_extent.size();
1953 m_cell_w = std::max<coord_t>(1, size.x() / GRID + 1);
1954 m_cell_h = std::max<coord_t>(1, size.y() / GRID + 1);
1955 m_grid.assign(GRID * GRID, {});
1956 for (size_t i = 0; i < m_bboxes.size(); ++i)
1957 for_cells(m_bboxes[i], [&](int cell) { m_grid[cell].emplace_back(i); });
1958 }
const ExPolygons & m_islands
Definition MultiMaterialSegmentation.cpp:1991
std::vector< std::vector< size_t > > m_grid
Definition MultiMaterialSegmentation.cpp:1995
coord_t m_cell_w
Definition MultiMaterialSegmentation.cpp:1994
static constexpr int GRID
Definition MultiMaterialSegmentation.cpp:1981
coord_t m_cell_h
Definition MultiMaterialSegmentation.cpp:1994
void for_cells(const BoundingBox &bb, Fn &&fn) const
Definition MultiMaterialSegmentation.cpp:1982
std::vector< BoundingBox > m_bboxes
Definition MultiMaterialSegmentation.cpp:1992
BoundingBox m_extent
Definition MultiMaterialSegmentation.cpp:1993
Kernel::Point_3 Point
Definition MeshRepair.cpp:81
BoundingBox get_extents(const ExPolygonsWithIds &e)
Definition Emboss.cpp:1374

References for_cells(), Slic3r::get_extents(), GRID, m_bboxes, m_cell_h, m_cell_w, m_extent, m_grid, and m_islands.

Here is the call graph for this function:

Member Function Documentation

◆ find()

void Slic3r::anonymous_namespace{MultiMaterialSegmentation.cpp}::IslandLocator::find ( const ExPolygon & piece,
std::vector< size_t > & out ) const
inline
1961 {
1962 out.clear();
1963 const BoundingBox bbox = get_extents(piece);
1964 if (!m_extent.defined || !m_extent.overlap(bbox))
1965 return;
1966 for_cells(bbox, [&](int cell) {
1967 for (size_t i : m_grid[cell])
1968 if (m_bboxes[i].overlap(bbox))
1969 out.emplace_back(i);
1970 });
1972 if (out.size() > 1)
1973 out.erase(std::remove_if(out.begin(), out.end(), [&](size_t i) {
1974 const BoundingBox common(m_bboxes[i].min.cwiseMax(bbox.min), m_bboxes[i].max.cwiseMin(bbox.max));
1975 return intersection(ClipperUtils::clip_clipper_polygons_with_subject_bbox(piece, common.inflated(SCALED_EPSILON)),
1976 ClipperUtils::clip_clipper_polygons_with_subject_bbox(m_islands[i], common.inflated(SCALED_EPSILON))).empty();
1977 }), out.end());
1978 }
void sort_remove_duplicates(std::vector< T > &vec)
Definition libslic3r.h:231

References for_cells(), Slic3r::get_extents(), m_bboxes, m_extent, m_grid, and Slic3r::sort_remove_duplicates().

Here is the call graph for this function:

◆ for_cells()

template<typename Fn>
void Slic3r::anonymous_namespace{MultiMaterialSegmentation.cpp}::IslandLocator::for_cells ( const BoundingBox & bb,
Fn && fn ) const
inlineprivate
1983 {
1984 const int x0 = std::clamp(int((bb.min.x() - m_extent.min.x()) / m_cell_w), 0, GRID - 1), x1 = std::clamp(int((bb.max.x() - m_extent.min.x()) / m_cell_w), 0, GRID - 1);
1985 const int y0 = std::clamp(int((bb.min.y() - m_extent.min.y()) / m_cell_h), 0, GRID - 1), y1 = std::clamp(int((bb.max.y() - m_extent.min.y()) / m_cell_h), 0, GRID - 1);
1986 for (int y = y0; y <= y1; ++y)
1987 for (int x = x0; x <= x1; ++x)
1988 fn(y * GRID + x);
1989 }

References GRID, m_cell_h, m_cell_w, m_extent, Slic3r::BoundingBoxBase< PointType, APointsType >::max, and Slic3r::BoundingBoxBase< PointType, APointsType >::min.

Referenced by IslandLocator(), and find().

Here is the caller graph for this function:

Member Data Documentation

◆ GRID

int Slic3r::anonymous_namespace{MultiMaterialSegmentation.cpp}::IslandLocator::GRID = 64
staticconstexprprivate

Referenced by IslandLocator(), and for_cells().

◆ m_bboxes

std::vector<BoundingBox> Slic3r::anonymous_namespace{MultiMaterialSegmentation.cpp}::IslandLocator::m_bboxes
private

Referenced by IslandLocator(), and find().

◆ m_cell_h

coord_t Slic3r::anonymous_namespace{MultiMaterialSegmentation.cpp}::IslandLocator::m_cell_h = 1
private

Referenced by IslandLocator(), and for_cells().

◆ m_cell_w

coord_t Slic3r::anonymous_namespace{MultiMaterialSegmentation.cpp}::IslandLocator::m_cell_w = 1
private

Referenced by IslandLocator(), and for_cells().

◆ m_extent

BoundingBox Slic3r::anonymous_namespace{MultiMaterialSegmentation.cpp}::IslandLocator::m_extent
private

Referenced by IslandLocator(), find(), and for_cells().

◆ m_grid

std::vector<std::vector<size_t> > Slic3r::anonymous_namespace{MultiMaterialSegmentation.cpp}::IslandLocator::m_grid
private

Referenced by IslandLocator(), and find().

◆ m_islands

const ExPolygons& Slic3r::anonymous_namespace{MultiMaterialSegmentation.cpp}::IslandLocator::m_islands
private

Referenced by IslandLocator().


The documentation for this class was generated from the following file: