Construct a new field to calculate Lightning Infill with.
52 :
56{
58
59 const BoundingBox overhang_bbox =
get_extents(current_overhang);
61 for (const ExPolygon &expoly : expolys) {
65
66 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 {
67 for (size_t sp_idx = range.begin(); sp_idx < range.end(); ++sp_idx) {
68 const Point &sp = sampled_points[sp_idx];
69
70 double d2 = std::numeric_limits<double>::max();
71 for (size_t icontour = 0; icontour <= expoly.holes.size(); ++icontour) {
72 const Polygon &contour = icontour == 0 ? expoly.contour : expoly.holes[icontour - 1];
73 if (contour.size() > 2) {
74 Point prev = contour.points.back();
75 for (const Point &p2 : contour.points) {
76 d2 = std::min(d2, Line::distance_to_squared(sp, prev, p2));
77 prev = p2;
78 }
79 }
80 }
81 self.m_unsupported_points[unsupported_points_prev_size + sp_idx] = {sp, coord_t(std::sqrt(d2))};
82 assert(self.m_unsupported_points_bbox.contains(sp));
83 }
84 });
85 }
87 constexpr coord_t prime_for_hash = 191;
88 return std::abs(b.dist_to_boundary - a.dist_to_boundary) > radius ?
89 a.dist_to_boundary < b.dist_to_boundary :
90 (PointHash{}(a.loc) % prime_for_hash) < (PointHash{}(b.loc) % prime_for_hash);
91 });
92
95
97
98
99
101
102#ifdef LIGHTNING_DISTANCE_FIELD_DEBUG_OUTPUT
103 {
104 static int iRun = 0;
106 }
107#endif
108}
std::vector< UnsupportedCell > m_unsupported_points
Definition DistanceField.hpp:104
UnsupportedPointsGrid m_unsupported_points_grid
Definition DistanceField.hpp:193
coord_t m_supporting_radius
Definition DistanceField.hpp:87
std::vector< bool > m_unsupported_points_erased
Definition DistanceField.hpp:105
int64_t m_supporting_radius2
Definition DistanceField.hpp:88
coord_t m_cell_size
Definition DistanceField.hpp:81
const BoundingBox m_unsupported_points_bbox
Definition DistanceField.hpp:110
Definition DistanceField.hpp:94
BoundingBox get_extents(const NodeSPtr &root_node)
Definition TreeNode.hpp:295
constexpr coord_t radius_per_cell_size
Definition DistanceField.cpp:31
std::string debug_out_path(const char *name,...)
Definition utils.cpp:382
std::vector< ExPolygon > ExPolygons
Definition ExPolygon.hpp:20
auto range(Cont &&cont)
Definition libslic3r.h:405
constexpr T sqr(T x)
Definition libslic3r.h:301
std::vector< Point, PointsAllocator< Point > > Points
Definition Point.hpp:73
Slic3r::ExPolygons union_ex(const Slic3r::Polygons &subject, PolyFillType fill_type)
Definition ClipperUtils.cpp:1011
Points sample_grid_pattern(const ExPolygon &expolygon, coord_t spacing, const BoundingBox &global_bounding_box)
Definition FillRectilinear.cpp:3741
ExPolygons offset2_ex(const ExPolygons &expolygons, const float delta1, const float delta2, JoinType joinType, double miterLimit)
Definition ClipperUtils.cpp:652