Refactored Lightning infill before parallelization.
This commit is contained in:
parent
f82d5c52b3
commit
95041751a1
@ -18,7 +18,12 @@ DistanceField::DistanceField(const coord_t& radius, const Polygons& current_outl
|
|||||||
m_supporting_radius2 = Slic3r::sqr(int64_t(radius));
|
m_supporting_radius2 = Slic3r::sqr(int64_t(radius));
|
||||||
// Sample source polygons with a regular grid sampling pattern.
|
// Sample source polygons with a regular grid sampling pattern.
|
||||||
for (const ExPolygon &expoly : union_ex(current_overhang)) {
|
for (const ExPolygon &expoly : union_ex(current_overhang)) {
|
||||||
for (const Point &p : sample_grid_pattern(expoly, m_cell_size)) {
|
const Points sampled_points = sample_grid_pattern(expoly, m_cell_size);
|
||||||
|
const size_t unsupported_points_prev_size = m_unsupported_points.size();
|
||||||
|
m_unsupported_points.resize(unsupported_points_prev_size + sampled_points.size());
|
||||||
|
|
||||||
|
for (size_t sp_idx = 0; sp_idx < sampled_points.size(); ++sp_idx) {
|
||||||
|
const Point &sp = sampled_points[sp_idx];
|
||||||
// Find a squared distance to the source expolygon boundary.
|
// Find a squared distance to the source expolygon boundary.
|
||||||
double d2 = std::numeric_limits<double>::max();
|
double d2 = std::numeric_limits<double>::max();
|
||||||
for (size_t icontour = 0; icontour <= expoly.holes.size(); ++icontour) {
|
for (size_t icontour = 0; icontour <= expoly.holes.size(); ++icontour) {
|
||||||
@ -26,12 +31,12 @@ DistanceField::DistanceField(const coord_t& radius, const Polygons& current_outl
|
|||||||
if (contour.size() > 2) {
|
if (contour.size() > 2) {
|
||||||
Point prev = contour.points.back();
|
Point prev = contour.points.back();
|
||||||
for (const Point &p2 : contour.points) {
|
for (const Point &p2 : contour.points) {
|
||||||
d2 = std::min(d2, Line::distance_to_squared(p, prev, p2));
|
d2 = std::min(d2, Line::distance_to_squared(sp, prev, p2));
|
||||||
prev = p2;
|
prev = p2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
m_unsupported_points.emplace_back(p, sqrt(d2));
|
m_unsupported_points[unsupported_points_prev_size + sp_idx] = {sp, coord_t(std::sqrt(d2))};
|
||||||
assert(m_unsupported_points_bbox.contains(p));
|
assert(m_unsupported_points_bbox.contains(p));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -83,7 +83,6 @@ protected:
|
|||||||
*/
|
*/
|
||||||
struct UnsupportedCell
|
struct UnsupportedCell
|
||||||
{
|
{
|
||||||
UnsupportedCell(const Point &loc, coord_t dist_to_boundary) : loc(loc), dist_to_boundary(dist_to_boundary) {}
|
|
||||||
// The position of the center of this cell.
|
// The position of the center of this cell.
|
||||||
Point loc;
|
Point loc;
|
||||||
// How far this cell is removed from the ``current_outline`` polygon, the edge of the infill area.
|
// How far this cell is removed from the ``current_outline`` polygon, the edge of the infill area.
|
||||||
|
@ -142,26 +142,25 @@ GroundingLocation Layer::getBestGroundingLocation
|
|||||||
|
|
||||||
const auto within_dist = coord_t((node_location - unsupported_location).cast<double>().norm());
|
const auto within_dist = coord_t((node_location - unsupported_location).cast<double>().norm());
|
||||||
|
|
||||||
NodeSPtr sub_tree{ nullptr };
|
NodeSPtr sub_tree{nullptr};
|
||||||
coord_t current_dist = getWeightedDistance(node_location, unsupported_location);
|
coord_t current_dist = getWeightedDistance(node_location, unsupported_location);
|
||||||
if (current_dist >= wall_supporting_radius) { // Only reconnect tree roots to other trees if they are not already close to the outlines.
|
if (current_dist >= wall_supporting_radius) { // Only reconnect tree roots to other trees if they are not already close to the outlines.
|
||||||
const coord_t search_radius = std::min(current_dist, within_dist);
|
const coord_t search_radius = std::min(current_dist, within_dist);
|
||||||
BoundingBox region(unsupported_location - Point(search_radius, search_radius), unsupported_location + Point(search_radius + locator_cell_size, search_radius + locator_cell_size));
|
BoundingBox region(unsupported_location - Point(search_radius, search_radius), unsupported_location + Point(search_radius + locator_cell_size, search_radius + locator_cell_size));
|
||||||
region.min = to_grid_point(region.min, current_outlines_bbox);
|
region.min = to_grid_point(region.min, current_outlines_bbox);
|
||||||
region.max = to_grid_point(region.max, current_outlines_bbox);
|
region.max = to_grid_point(region.max, current_outlines_bbox);
|
||||||
Point grid_addr;
|
|
||||||
for (grid_addr.y() = region.min.y(); grid_addr.y() < region.max.y(); ++ grid_addr.y())
|
for (coord_t grid_addr_y = region.min.y(); grid_addr_y < region.max.y(); ++grid_addr_y)
|
||||||
for (grid_addr.x() = region.min.x(); grid_addr.x() < region.max.x(); ++ grid_addr.x()) {
|
for (coord_t grid_addr_x = region.min.x(); grid_addr_x < region.max.x(); ++grid_addr_x) {
|
||||||
auto it_range = tree_node_locator.equal_range(grid_addr);
|
const auto it_range = tree_node_locator.equal_range({grid_addr_x, grid_addr_y});
|
||||||
for (auto it = it_range.first; it != it_range.second; ++ it) {
|
for (auto it = it_range.first; it != it_range.second; ++it) {
|
||||||
auto candidate_sub_tree = it->second.lock();
|
const NodeSPtr candidate_sub_tree = it->second.lock();
|
||||||
if ((candidate_sub_tree && candidate_sub_tree != exclude_tree) &&
|
if ((candidate_sub_tree && candidate_sub_tree != exclude_tree) &&
|
||||||
!(exclude_tree && exclude_tree->hasOffspring(candidate_sub_tree)) &&
|
!(exclude_tree && exclude_tree->hasOffspring(candidate_sub_tree)) &&
|
||||||
!polygonCollidesWithLineSegment(unsupported_location, candidate_sub_tree->getLocation(), outline_locator)) {
|
!polygonCollidesWithLineSegment(unsupported_location, candidate_sub_tree->getLocation(), outline_locator)) {
|
||||||
const coord_t candidate_dist = candidate_sub_tree->getWeightedDistance(unsupported_location, supporting_radius);
|
if (const coord_t candidate_dist = candidate_sub_tree->getWeightedDistance(unsupported_location, supporting_radius); candidate_dist < current_dist) {
|
||||||
if (candidate_dist < current_dist) {
|
|
||||||
current_dist = candidate_dist;
|
current_dist = candidate_dist;
|
||||||
sub_tree = candidate_sub_tree;
|
sub_tree = candidate_sub_tree;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user