597 {
600 {
601 #ifdef SUPPORT_USE_AGG_RASTERIZER
603 #else
604
605 assert(std::abs(2 * offset_in_grid) < m_grid.resolution());
606 Polygons support_polygons_simplified = m_grid.contours_simplified(offset_in_grid, fill_holes);
607 #endif
608
610
611
613
614
615
616
617
619 offset_in_grid > 0 ?
620
622
624
625 std::vector<std::pair<Point,bool>> samples_inside;
626 for (ExPolygon &island : islands) {
628
629 auto it_lower = std::lower_bound(samples.begin(), samples.end(),
Point(bbox.min -
Point(1, 1)));
630 auto it_upper = std::upper_bound(samples.begin(), samples.end(),
Point(bbox.max +
Point(1, 1)));
631 samples_inside.clear();
632 for (auto it = it_lower; it != it_upper; ++ it)
633 if (bbox.contains(*it))
634 samples_inside.push_back(std::make_pair(*it, false));
635 if (! samples_inside.empty()) {
636
637 for (size_t i_contour = 0; i_contour <= island.holes.size(); ++ i_contour) {
642
643
644 for (auto &sample_inside : samples_inside) {
645 if (((*i)(1) > sample_inside.first(1)) != ((*j)(1) > sample_inside.first(1))) {
646 double x1 = (double)sample_inside.first(0);
647 double x2 = (double)(*i)(0) + (double)((*j)(0) - (*i)(0)) * (double)(sample_inside.first(1) - (*i)(1)) / (double)((*j)(1) - (*i)(1));
648 if (x1 < x2)
649 sample_inside.second = !sample_inside.second;
650 }
651 }
652 }
653 }
654
655 for (auto &sample_inside : samples_inside)
656 if (sample_inside.second) {
658 island.clear();
659 break;
660 }
661 }
662 }
663
664 #ifdef SLIC3R_DEBUG
666 if (! islands.empty())
668 if (!out.empty())
670 if (!support_polygons_simplified.empty())
671 bbox.merge(
get_extents(support_polygons_simplified));
672 SVG svg(
debug_out_path(
"extract_support_from_grid_trimmed-%s-%d-%d-%lf.svg", step_name, iRun, layer_id, print_z).c_str(), bbox);
673 svg.draw(
union_ex(support_polygons_simplified),
"gray", 0.25f);
674 svg.draw(islands, "red", 0.5f);
675 svg.draw(
union_ex(out),
"green", 0.5f);
677 svg.draw_outline(islands,
"red",
"red",
scale_(0.05));
680 for (
const Point &pt : samples)
682 svg.Close();
683 #endif
684
687 return out;
688 }
691
692 [[fallthrough]];
694
697#ifdef SLIC3R_DEBUG
700 { {
union_ex(
smooth_outward(
closing(*
m_support_polygons, closing_distance,
SUPPORT_SURFACES_OFFSET_PARAMETERS), smoothing_distance)) }, {
"regularized",
"red",
"black",
"", scaled<coord_t>(0.1f), 0.5f } },
702 });
703#endif
704
705
707 }
708 assert(false);
710 }
#define SUPPORT_SURFACES_OFFSET_PARAMETERS
Definition SupportCommon.cpp:41
Points points
Definition MultiPoint.hpp:18
static void export_expolygons(const char *path, const BoundingBox &bbox, const Slic3r::ExPolygons &expolygons, std::string stroke_outer="black", std::string stroke_holes="blue", coordf_t stroke_width=0)
Definition SVG.cpp:309
static Points island_samples(const ExPolygons &expolygons)
Definition SupportMaterial.cpp:918
if(!(yy_init))
Definition lexer.c:1190
void draw(const IconManager::Icon &icon, const ImVec2 &size, const ImVec4 &tint_col, const ImVec4 &border_col)
Draw imgui image with icon.
Definition IconManager.cpp:164
std::vector< Polygon, PointsAllocator< Polygon > > Polygons
Definition Polygon.hpp:15
void smooth_outward(MutablePolygon &polygon, coord_t clip_dist_scaled)
Definition MutablePolygon.cpp:261
Slic3r::ExPolygons diff_ex(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset)
Definition ClipperUtils.cpp:726
Slic3r::Polygons expand(const Slic3r::Polygon &polygon, const float delta, ClipperLib::JoinType joinType=DefaultJoinType, double miterLimit=DefaultMiterLimit)
Definition ClipperUtils.hpp:363
Slic3r::ExPolygons union_ex(const Slic3r::Polygons &subject, ClipperLib::PolyFillType fill_type)
Definition ClipperUtils.cpp:774
std::vector< ExPolygon > ExPolygons
Definition ExPolygon.hpp:13
Slic3r::Polygons closing(const Slic3r::Polygons &polygons, const float delta1, const float delta2, ClipperLib::JoinType joinType, double miterLimit)
Definition ClipperUtils.cpp:587
Slic3r::ExPolygons intersection_ex(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset)
Definition ClipperUtils.cpp:755
void polygons_append(Polygons &dst, const ExPolygon &src)
Definition ExPolygon.hpp:375
@ smsOrganic
Definition PrintConfig.hpp:90
@ smsTree
Definition PrintConfig.hpp:90
static Polygons contours_simplified(const Vec2i &grid_size, const double pixel_size, Point left_bottom, const std::vector< unsigned char > &grid, coord_t offset, bool fill_holes)
Definition SupportMaterial.cpp:103
std::vector< Point, PointsAllocator< Point > > Points
Definition Point.hpp:58
const Polygon & contour(const ExPolygon &p)
Definition AGGRaster.hpp:21
const Polygons & holes(const ExPolygon &p)
Definition AGGRaster.hpp:22
Slic3r::Polygon Polygon
Definition Emboss.cpp:34
Kernel::Point_2 Point
Definition point_areas.cpp:20