OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor > Class Template Reference

#include </home/runner/work/OrcaSlicer/OrcaSlicer/src/libslic3r/Point.hpp>

Collaboration diagram for Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >:

Public Member Functions

 ClosestPointInRadiusLookup (coord_t search_radius, PointAccessor point_accessor=PointAccessor())
void insert (const ValueType &value)
void insert (ValueType &&value)
bool erase (const ValueType &value)
std::pair< const ValueType *, double > find (const Vec2crd &pt)
std::vector< std::pair< const ValueType *, double > > find_all (const Vec2crd &pt)

Private Types

using map_type = typename std::unordered_multimap<Vec2crd, ValueType, PointHash>

Private Attributes

PointAccessor m_point_accessor
map_type m_map
coord_t m_search_radius
coord_t m_grid_resolution
coord_t m_grid_log2

Detailed Description

template<typename ValueType, typename PointAccessor>
class Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >

Member Typedef Documentation

◆ map_type

template<typename ValueType, typename PointAccessor>
using Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::map_type = typename std::unordered_multimap<Vec2crd, ValueType, PointHash>
private

Constructor & Destructor Documentation

◆ ClosestPointInRadiusLookup()

template<typename ValueType, typename PointAccessor>
Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::ClosestPointInRadiusLookup ( coord_t search_radius,
PointAccessor point_accessor = PointAccessor() )
inline
518 :
520 {
521 // Resolution of a grid, twice the search radius + some epsilon.
525 assert(m_grid_resolution < (coord_t(1) << 30));
526 // Compute m_grid_log2 = log2(m_grid_resolution)
527 if (m_grid_resolution > 32767) {
528 m_grid_resolution >>= 16;
529 m_grid_log2 += 16;
530 }
531 if (m_grid_resolution > 127) {
532 m_grid_resolution >>= 8;
533 m_grid_log2 += 8;
534 }
535 if (m_grid_resolution > 7) {
536 m_grid_resolution >>= 4;
537 m_grid_log2 += 4;
538 }
539 if (m_grid_resolution > 1) {
540 m_grid_resolution >>= 2;
541 m_grid_log2 += 2;
542 }
543 if (m_grid_resolution > 0)
544 ++ m_grid_log2;
548 }
Definition Point.hpp:516
coord_t m_grid_log2
Definition Point.hpp:645
coord_t m_search_radius
Definition Point.hpp:643
PointAccessor m_point_accessor
Definition Point.hpp:641
coord_t m_grid_resolution
Definition Point.hpp:644
int64_t coord_t
Definition libslic3r.h:48

References m_grid_log2, m_grid_resolution, m_point_accessor, and m_search_radius.

Member Function Documentation

◆ erase()

template<typename ValueType, typename PointAccessor>
bool Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::erase ( const ValueType & value)
inline
564 {
565 const Point *pt = m_point_accessor(value);
566 if (pt != nullptr) {
567 // Range of fragment starts around grid_corner, close to pt.
568 auto range = m_map.equal_range(Point((*pt).x()>>m_grid_log2, (*pt).y()>>m_grid_log2));
569 // Remove the first item.
570 for (auto it = range.first; it != range.second; ++ it) {
571 if (it->second == value) {
572 m_map.erase(it);
573 return true;
574 }
575 }
576 }
577 return false;
578 }
map_type m_map
Definition Point.hpp:642

References m_grid_log2, m_map, m_point_accessor, and Slic3r::range().

Here is the call graph for this function:

◆ find()

template<typename ValueType, typename PointAccessor>
std::pair< const ValueType *, double > Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::find ( const Vec2crd & pt)
inline
581 {
582 // Iterate over 4 closest grid cells around pt,
583 // find the closest start point inside these cells to pt.
584 const ValueType *value_min = nullptr;
586 // Round pt to a closest grid_cell corner.
588 // For four neighbors of grid_corner:
589 for (coord_t neighbor_y = -1; neighbor_y < 1; ++ neighbor_y) {
590 for (coord_t neighbor_x = -1; neighbor_x < 1; ++ neighbor_x) {
591 // Range of fragment starts around grid_corner, close to pt.
592 auto range = m_map.equal_range(Vec2crd(grid_corner.x() + neighbor_x, grid_corner.y() + neighbor_y));
593 // Find the map entry closest to pt.
594 for (auto it = range.first; it != range.second; ++it) {
595 const ValueType &value = it->second;
597 if (pt2 != nullptr) {
598 const double d2 = (pt - *pt2).cast<double>().squaredNorm();
599 if (d2 < dist_min) {
600 dist_min = d2;
601 value_min = &value;
602 }
603 }
604 }
605 }
606 }
607 return (value_min != nullptr && dist_min < coordf_t(m_search_radius) * coordf_t(m_search_radius)) ?
610 }
double coordf_t
Definition GUI_ObjectList.hpp:46
Eigen::Matrix< coord_t, 2, 1, Eigen::DontAlign > Vec2crd
Definition Point.hpp:52

References Slic3r::cast(), m_grid_log2, m_grid_resolution, m_map, m_point_accessor, m_search_radius, and Slic3r::range().

Referenced by Slic3r::modulate_extrusion_by_overlapping_layers().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ find_all()

template<typename ValueType, typename PointAccessor>
std::vector< std::pair< const ValueType *, double > > Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::find_all ( const Vec2crd & pt)
inline
613 {
614 // Iterate over 4 closest grid cells around pt,
615 // Round pt to a closest grid_cell corner.
617 // For four neighbors of grid_corner:
619 const double r2 = double(m_search_radius) * m_search_radius;
620 for (coord_t neighbor_y = -1; neighbor_y < 1; ++ neighbor_y) {
621 for (coord_t neighbor_x = -1; neighbor_x < 1; ++ neighbor_x) {
622 // Range of fragment starts around grid_corner, close to pt.
623 auto range = m_map.equal_range(Vec2crd(grid_corner.x() + neighbor_x, grid_corner.y() + neighbor_y));
624 // Find the map entry closest to pt.
625 for (auto it = range.first; it != range.second; ++it) {
626 const ValueType &value = it->second;
628 if (pt2 != nullptr) {
629 const double d2 = (pt - *pt2).cast<double>().squaredNorm();
630 if (d2 <= r2)
631 out.emplace_back(&value, d2);
632 }
633 }
634 }
635 }
636 return out;
637 }

References Slic3r::cast(), m_grid_log2, m_grid_resolution, m_map, m_point_accessor, m_search_radius, and Slic3r::range().

Here is the call graph for this function:

◆ insert() [1/2]

template<typename ValueType, typename PointAccessor>
void Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::insert ( const ValueType & value)
inline
550 {
552 if (pt != nullptr)
553 m_map.emplace(std::make_pair(Vec2crd(pt->x()>>m_grid_log2, pt->y()>>m_grid_log2), value));
554 }

References m_grid_log2, m_map, and m_point_accessor.

Referenced by Slic3r::modulate_extrusion_by_overlapping_layers().

Here is the caller graph for this function:

◆ insert() [2/2]

template<typename ValueType, typename PointAccessor>
void Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::insert ( ValueType && value)
inline
556 {
558 if (pt != nullptr)
560 }

References m_grid_log2, m_map, and m_point_accessor.

Member Data Documentation

◆ m_grid_log2

template<typename ValueType, typename PointAccessor>
coord_t Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::m_grid_log2
private

◆ m_grid_resolution

template<typename ValueType, typename PointAccessor>
coord_t Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::m_grid_resolution
private

◆ m_map

template<typename ValueType, typename PointAccessor>
map_type Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::m_map
private

Referenced by erase(), find(), find_all(), insert(), and insert().

◆ m_point_accessor

template<typename ValueType, typename PointAccessor>
PointAccessor Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::m_point_accessor
private

◆ m_search_radius

template<typename ValueType, typename PointAccessor>
coord_t Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::m_search_radius
private

The documentation for this class was generated from the following file:
  • /home/runner/work/OrcaSlicer/OrcaSlicer/src/libslic3r/Point.hpp