701 {
703
704 struct CPoint
705 {
706 CPoint() = delete;
707 CPoint(
const Vec2d &point,
size_t contour_idx,
size_t point_idx) : m_point_double(point), m_point(
mk_point(point)), m_point_idx(point_idx), m_contour_idx(contour_idx) {}
708 CPoint(
const Vec2d &point,
size_t point_idx) : m_point_double(point), m_point(
mk_point(point)), m_point_idx(point_idx), m_contour_idx(0) {}
709 const Vec2d m_point_double;
711 size_t m_point_idx;
712 size_t m_contour_idx;
713
714 [[nodiscard]]
const Vec2d &point_double()
const {
return m_point_double; }
715 [[nodiscard]]
const Point &point()
const {
return m_point; }
716 bool operator==(
const CPoint &rhs)
const {
return m_point_double == rhs.m_point_double && m_contour_idx == rhs.m_contour_idx && m_point_idx == rhs.m_point_idx; }
717 };
718 struct CPointAccessor {
const Point* operator()(
const CPoint &pt)
const {
return &pt.point(); }};
719 typedef ClosestPointInRadiusLookup<CPoint, CPointAccessor> CPointLookupType;
720
723 for (const Polygon &polygon : color_poly_tmp)
725 closest_contour_point.insert(CPoint(
Vec2d(pt.
x(), pt.
y()), &polygon - &color_poly_tmp.
front(), &pt - &polygon.points.
front()));
726
727 for (const voronoi_diagram<double>::vertex_type &vertex : vd.vertices()) {
731
734
736 assert(
vertex.color() !=
vertex.incident_edge()->cell()->source_index());
737 assert(
vertex.color() !=
vertex.incident_edge()->twin()->cell()->source_index());
740 assert(
vertex.color() !=
vertex.incident_edge()->cell()->source_index());
741 assert(
vertex.color() !=
vertex.incident_edge()->twin()->cell()->source_index());
743 } else if (bbox.contains(vertex_point)) {
744 if (
auto [contour_pt, c_dist_sqr] = closest_contour_point.find(vertex_point); contour_pt !=
nullptr && c_dist_sqr <
Slic3r::sqr(3 *
SCALED_EPSILON)) {
746 }
else if (
auto [voronoi_pt, v_dist_sqr] = closest_voronoi_point.find(vertex_point); voronoi_pt ==
nullptr || v_dist_sqr >=
Slic3r::sqr(
SCALED_EPSILON / 10.0)) {
747 closest_voronoi_point.insert(CPoint(vertex_point_double, this->
nodes_count()));
749 this->
nodes.push_back({vertex_point_double});
750 } else {
751
752
753 std::vector<std::pair<const CPoint *, double>> all_closes_c_points = closest_voronoi_point.find_all(vertex_point);
754 int merge_to_point = -1;
755 for (const std::pair<const CPoint *, double> &c_point : all_closes_c_points)
756 if ((vertex_point_double - c_point.first->point_double()).squaredNorm() <=
Slic3r::
sqr(
EPSILON)) {
757 merge_to_point = int(c_point.first->m_point_idx);
758 break;
759 }
760
761 if (merge_to_point != -1) {
762 vertex.color(merge_to_point);
763 } else {
764 closest_voronoi_point.insert(CPoint(vertex_point_double, this->
nodes_count()));
766 this->
nodes.push_back({vertex_point_double});
767 }
768 }
769 }
770 }
771 }
#define const
Definition getopt.c:38
#define SCALED_EPSILON
Definition libslic3r.h:71
static constexpr double EPSILON
Definition libslic3r.h:51
int32_t coord_t
Definition libslic3r.h:39
bool operator==(const IntPoint &l, const IntPoint &r)
Definition clipper.cpp:93
const Scalar & y
Definition MathFunctions.h:552
Vec2d vertex_point(const VD::vertex_type &v)
Definition VoronoiOffset.hpp:26
Definition avrdude-slic3r.cpp:16
Eigen::Matrix< double, 2, 1, Eigen::DontAlign > Vec2d
Definition Point.hpp:51
static bool vertex_equal_to_point(const Voronoi::VD::vertex_type &vertex, const Vec2d &ipt)
Definition MultiMaterialSegmentation.cpp:183
constexpr T sqr(T x)
Definition libslic3r.h:258
static Point mk_point(const Voronoi::VD::vertex_type *point)
Definition MultiMaterialSegmentation.cpp:543
TCoord< P > x(const P &p)
Definition geometry_traits.hpp:297
TPoint< S > & vertex(S &sh, unsigned long idx, const PolygonTag &)
Definition geometry_traits.hpp:1180
TPoint< P > front(const P &p)
Definition geometry_traits.hpp:872
Kernel::Point_2 Point
Definition point_areas.cpp:20
size_t from_idx
Definition MultiMaterialSegmentation.cpp:559
size_t nodes_count() const
Definition MultiMaterialSegmentation.cpp:629
MMU_Graph::Arc get_border_arc(size_t idx) const
Definition MultiMaterialSegmentation.cpp:624