560{
561
562
563 float support_force_deficit = deficit;
564
565
570
571 if (bbdim.x() > bbdim.y()) std::swap(bbdim.x(), bbdim.y());
572 double aspectr = bbdim.y() / bbdim.x();
573
574 support_force_deficit *= (1 + aspectr / 2.);
575 }
576
577 if (support_force_deficit < 0)
578 return;
579
580
581 const size_t poisson_samples_target = size_t(ceil(support_force_deficit /
m_config.support_force()));
582
583 const float density_horizontal =
m_config.tear_pressure() /
m_config.support_force();
584
585 float poisson_radius = std::max(
m_config.minimal_distance, 1.f / (5.f * density_horizontal));
586
587 const float samples_per_mm2 = 30.f / (float(
M_PI) * poisson_radius * poisson_radius);
588
589
590 float min_spacing = poisson_radius;
591
592
593
594 std::vector<Vec2f> raw_samples =
597 5.f / poisson_radius,
m_rng) :
599
600 std::vector<Vec2f> poisson_samples;
601 for (size_t iter = 0; iter < 4; ++ iter) {
603 [&structure, &grid3d, min_spacing](
const Vec2f &
pos) {
604 return grid3d.collides_with(
pos, structure.layer->print_z, min_spacing);
605 });
606 if (poisson_samples.size() >= poisson_samples_target ||
m_config.minimal_distance > poisson_radius-
EPSILON)
607 break;
608 float coeff = 0.5f;
609 if (poisson_samples.size() * 2 > poisson_samples_target)
610 coeff = float(poisson_samples.size()) / float(poisson_samples_target);
611 poisson_radius = std::max(
m_config.minimal_distance, poisson_radius * coeff);
612 min_spacing = std::max(
m_config.minimal_distance, min_spacing * coeff);
613 }
614
615#ifdef SLA_SUPPORTPOINTGEN_DEBUG
616 {
617 static int irun = 0;
619 for (const ExPolygon &island : islands)
620 svg.draw(island);
621 for (
const Vec2f &pt : raw_samples)
623 for (
const Vec2f &pt : poisson_samples)
625 }
626#endif
627
628
629 if (poisson_samples_target < poisson_samples.size()) {
630 std::shuffle(poisson_samples.begin(), poisson_samples.end(), m_rng);
631 poisson_samples.erase(poisson_samples.begin() + poisson_samples_target, poisson_samples.end());
632 }
633 for (
const Vec2f &pt : poisson_samples) {
635 structure.supports_force_this_layer +=
m_config.support_force();
636 grid3d.insert(pt, &structure);
637 }
638}
#define EPSILON
Definition ColorUtils.cpp:64
#define M_PI
Definition ExtrusionSimulator.cpp:31
@ pcConvex
Definition MinAreaBoundingBox.hpp:25
#define scale_(val)
Definition libslic3r.h:106
Polygon convex_hull(Points pts)
Definition ConvexHull.cpp:21
Kernel::Point_3 Point
Definition MeshRepair.cpp:81
Vec3d pos(const Pt &p)
Definition ReprojectPointsOnMesh.hpp:16
std::vector< Vec2f > sample_expolygon_with_boundary(const ExPolygon &expoly, float samples_per_mm2, float samples_per_mm_boundary, std::mt19937 &rng)
Definition SupportPointGenerator.cpp:428
std::vector< Vec2f > sample_expolygon(const ExPolygon &expoly, float samples_per_mm2, std::mt19937 &rng)
Definition SupportPointGenerator.cpp:348
static std::vector< Vec2f > poisson_disk_from_samples(const std::vector< Vec2f > &raw_samples, float radius, REFUSE_FUNCTION refuse_function)
Definition SupportPointGenerator.cpp:444
std::string debug_out_path(const char *name,...)
Definition utils.cpp:382
BoundingBox get_extents(const ExPolygonsWithIds &e)
Definition Emboss.cpp:1374
constexpr Eigen::Matrix< Tout, 2, EigenArgs... > unscaled(const Slic3r::Point &v) noexcept
Definition Arrange.cpp:81
Eigen::Matrix< float, 2, 1, Eigen::DontAlign > Vec2f
Definition Point.hpp:64
Eigen::Matrix< double, 2, 1, Eigen::DontAlign > Vec2d
Definition Point.hpp:67