Prusa Slicer 2.6.0
Loading...
Searching...
No Matches
Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor > Class Template Reference

#include <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
333 :
334 m_search_radius(search_radius), m_point_accessor(point_accessor), m_grid_log2(0)
335 {
336 // Resolution of a grid, twice the search radius + some epsilon.
337 coord_t gridres = 2 * m_search_radius + 4;
338 m_grid_resolution = gridres;
339 assert(m_grid_resolution > 0);
340 assert(m_grid_resolution < (coord_t(1) << 30));
341 // Compute m_grid_log2 = log2(m_grid_resolution)
342 if (m_grid_resolution > 32767) {
343 m_grid_resolution >>= 16;
344 m_grid_log2 += 16;
345 }
346 if (m_grid_resolution > 127) {
347 m_grid_resolution >>= 8;
348 m_grid_log2 += 8;
349 }
350 if (m_grid_resolution > 7) {
351 m_grid_resolution >>= 4;
352 m_grid_log2 += 4;
353 }
354 if (m_grid_resolution > 1) {
355 m_grid_resolution >>= 2;
356 m_grid_log2 += 2;
357 }
358 if (m_grid_resolution > 0)
359 ++ m_grid_log2;
361 assert(m_grid_resolution >= gridres);
362 assert(gridres > m_grid_resolution / 2);
363 }
coord_t m_grid_log2
Definition Point.hpp:460
coord_t m_search_radius
Definition Point.hpp:458
PointAccessor m_point_accessor
Definition Point.hpp:456
coord_t m_grid_resolution
Definition Point.hpp:459
int32_t coord_t
Definition libslic3r.h:39

References Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::m_grid_log2, Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::m_grid_resolution, and Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::m_search_radius.

Member Function Documentation

◆ erase()

template<typename ValueType , typename PointAccessor >
bool Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::erase ( const ValueType &  value)
inline
379 {
380 const Point *pt = m_point_accessor(value);
381 if (pt != nullptr) {
382 // Range of fragment starts around grid_corner, close to pt.
383 auto range = m_map.equal_range(Point((*pt).x()>>m_grid_log2, (*pt).y()>>m_grid_log2));
384 // Remove the first item.
385 for (auto it = range.first; it != range.second; ++ it) {
386 if (it->second == value) {
387 m_map.erase(it);
388 return true;
389 }
390 }
391 }
392 return false;
393 }
map_type m_map
Definition Point.hpp:457
auto range(Cont &&cont)
Definition libslic3r.h:356
Kernel::Point_2 Point
Definition point_areas.cpp:20

References Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::m_grid_log2, Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::m_map, Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::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
396 {
397 // Iterate over 4 closest grid cells around pt,
398 // find the closest start point inside these cells to pt.
399 const ValueType *value_min = nullptr;
400 double dist_min = std::numeric_limits<double>::max();
401 // Round pt to a closest grid_cell corner.
402 Vec2crd grid_corner((pt.x()+(m_grid_resolution>>1))>>m_grid_log2, (pt.y()+(m_grid_resolution>>1))>>m_grid_log2);
403 // For four neighbors of grid_corner:
404 for (coord_t neighbor_y = -1; neighbor_y < 1; ++ neighbor_y) {
405 for (coord_t neighbor_x = -1; neighbor_x < 1; ++ neighbor_x) {
406 // Range of fragment starts around grid_corner, close to pt.
407 auto range = m_map.equal_range(Vec2crd(grid_corner.x() + neighbor_x, grid_corner.y() + neighbor_y));
408 // Find the map entry closest to pt.
409 for (auto it = range.first; it != range.second; ++it) {
410 const ValueType &value = it->second;
411 const Vec2crd *pt2 = m_point_accessor(value);
412 if (pt2 != nullptr) {
413 const double d2 = (pt - *pt2).cast<double>().squaredNorm();
414 if (d2 < dist_min) {
415 dist_min = d2;
416 value_min = &value;
417 }
418 }
419 }
420 }
421 }
422 return (value_min != nullptr && dist_min < coordf_t(m_search_radius) * coordf_t(m_search_radius)) ?
423 std::make_pair(value_min, dist_min) :
424 std::make_pair(nullptr, std::numeric_limits<double>::max());
425 }
double coordf_t
Definition GUI_ObjectList.hpp:36
Eigen::Matrix< coord_t, 2, 1, Eigen::DontAlign > Vec2crd
Definition Point.hpp:37

References Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::m_grid_log2, Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::m_grid_resolution, Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::m_map, Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::m_point_accessor, Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::m_search_radius, and Slic3r::range().

Referenced by Slic3r::FFFSupport::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
428 {
429 // Iterate over 4 closest grid cells around pt,
430 // Round pt to a closest grid_cell corner.
431 Vec2crd grid_corner((pt.x()+(m_grid_resolution>>1))>>m_grid_log2, (pt.y()+(m_grid_resolution>>1))>>m_grid_log2);
432 // For four neighbors of grid_corner:
433 std::vector<std::pair<const ValueType*, double>> out;
434 const double r2 = double(m_search_radius) * m_search_radius;
435 for (coord_t neighbor_y = -1; neighbor_y < 1; ++ neighbor_y) {
436 for (coord_t neighbor_x = -1; neighbor_x < 1; ++ neighbor_x) {
437 // Range of fragment starts around grid_corner, close to pt.
438 auto range = m_map.equal_range(Vec2crd(grid_corner.x() + neighbor_x, grid_corner.y() + neighbor_y));
439 // Find the map entry closest to pt.
440 for (auto it = range.first; it != range.second; ++it) {
441 const ValueType &value = it->second;
442 const Vec2crd *pt2 = m_point_accessor(value);
443 if (pt2 != nullptr) {
444 const double d2 = (pt - *pt2).cast<double>().squaredNorm();
445 if (d2 <= r2)
446 out.emplace_back(&value, d2);
447 }
448 }
449 }
450 }
451 return out;
452 }

References Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::m_grid_log2, Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::m_grid_resolution, Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::m_map, Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::m_point_accessor, Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::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
365 {
366 const Vec2crd *pt = m_point_accessor(value);
367 if (pt != nullptr)
368 m_map.emplace(std::make_pair(Vec2crd(pt->x()>>m_grid_log2, pt->y()>>m_grid_log2), value));
369 }

References Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::m_grid_log2, Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::m_map, and Slic3r::ClosestPointInRadiusLookup< ValueType, PointAccessor >::m_point_accessor.

Referenced by Slic3r::FFFSupport::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

Member Data Documentation

◆ m_grid_log2

◆ m_grid_resolution

◆ m_map

◆ m_point_accessor

◆ m_search_radius


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