Construct a new field to calculate Lightning Infill with.
38 :
42{
44
45 const BoundingBox overhang_bbox =
get_extents(current_overhang);
46 for (
const ExPolygon &expoly :
union_ex(current_overhang)) {
50
51 tbb::parallel_for(tbb::blocked_range<size_t>(0, sampled_points.size()), [&self = *
this, &expoly = std::as_const(expoly), &sampled_points = std::as_const(sampled_points), &unsupported_points_prev_size = std::as_const(unsupported_points_prev_size)](
const tbb::blocked_range<size_t> &
range) ->
void {
52 for (size_t sp_idx = range.begin(); sp_idx < range.end(); ++sp_idx) {
53 const Point &sp = sampled_points[sp_idx];
54
55 double d2 = std::numeric_limits<double>::max();
56 for (size_t icontour = 0; icontour <= expoly.holes.size(); ++icontour) {
57 const Polygon &contour = icontour == 0 ? expoly.contour : expoly.holes[icontour - 1];
58 if (contour.size() > 2) {
59 Point prev = contour.points.back();
60 for (const Point &p2 : contour.points) {
61 d2 = std::min(d2, Line::distance_to_squared(sp, prev, p2));
62 prev = p2;
63 }
64 }
65 }
66 self.m_unsupported_points[unsupported_points_prev_size + sp_idx] = {sp, coord_t(std::sqrt(d2))};
67 assert(self.m_unsupported_points_bbox.contains(sp));
68 }
69 });
70 }
72 constexpr coord_t prime_for_hash = 191;
73 return std::abs(b.dist_to_boundary - a.dist_to_boundary) > radius ?
74 a.dist_to_boundary < b.dist_to_boundary :
75 (PointHash{}(
a.loc) % prime_for_hash) < (PointHash{}(
b.loc) % prime_for_hash);
76 });
77
80
82
83
84
86
87#ifdef LIGHTNING_DISTANCE_FIELD_DEBUG_OUTPUT
88 {
89 static int iRun = 0;
91 }
92#endif
93}
void initialize(const std::vector< UnsupportedCell > &unsupported_points, const std::function< Point(const Point &)> &map_cell_to_grid)
Definition DistanceField.hpp:114
size_t size() const
Definition DistanceField.hpp:138
std::vector< UnsupportedCell > m_unsupported_points
Definition DistanceField.hpp:97
UnsupportedPointsGrid m_unsupported_points_grid
Definition DistanceField.hpp:186
coord_t m_supporting_radius
Definition DistanceField.hpp:80
std::vector< bool > m_unsupported_points_erased
Definition DistanceField.hpp:98
int64_t m_supporting_radius2
Definition DistanceField.hpp:81
coord_t m_cell_size
Definition DistanceField.hpp:74
const BoundingBox m_unsupported_points_bbox
Definition DistanceField.hpp:103
BoundingBox get_extents(const NodeSPtr &root_node)
Definition TreeNode.hpp:284
constexpr coord_t radius_per_cell_size
Definition DistanceField.cpp:17
std::string debug_out_path(const char *name,...)
Definition utils.cpp:218
Slic3r::ExPolygons union_ex(const Slic3r::Polygons &subject, ClipperLib::PolyFillType fill_type)
Definition ClipperUtils.cpp:774
auto range(Cont &&cont)
Definition libslic3r.h:356
constexpr T sqr(T x)
Definition libslic3r.h:258
Points sample_grid_pattern(const ExPolygon &expolygon, coord_t spacing, const BoundingBox &global_bounding_box)
Definition FillRectilinear.cpp:3062
std::vector< Point, PointsAllocator< Point > > Points
Definition Point.hpp:58
Kernel::Point_2 Point
Definition point_areas.cpp:20
__int64 int64_t
Definition unistd.h:76