OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::MultiPoint3 Class Referenceabstract

#include </home/runner/work/OrcaSlicer/OrcaSlicer/src/libslic3r/MultiPoint.hpp>

Inheritance diagram for Slic3r::MultiPoint3:
Collaboration diagram for Slic3r::MultiPoint3:

Public Member Functions

void append (const Point3 &point)
void append (const Vec3crd &point)
void append (const Points3::const_iterator &begin, const Points3::const_iterator &end)
void translate (double x, double y, double z=0)
void translate (const Point3 &vector)
void reverse ()
void rotate (double angle)
void rotate (double cos_angle, double sin_angle)
void rotate (double angle, const Point3 &center)
Point3 & first_point ()
Point3 & last_point ()
const Point3 & first_point () const
const Point3 & last_point () const
size_t size () const
bool empty () const
void clear ()
auto begin ()
auto end ()
auto begin () const
auto end () const
virtual Lines3 lines () const =0
double length () const
bool is_valid () const
BoundingBox3 bounding_box () const
int find_point (const Point &point) const
int find_point (const Point &point, const double scaled_epsilon) const
int find_point (const Point3 &point) const
int find_point (const Point3 &point, const double scaled_epsilon) const
bool remove_duplicate_points ()

Static Public Member Functions

static Points3 _douglas_peucker (const Points3 &points, double tolerance)

Public Attributes

Points3 points

Detailed Description

Member Function Documentation

◆ _douglas_peucker()

Points3 Slic3r::MultiPoint3::_douglas_peucker ( const Points3 & points,
double tolerance )
static
478{
479 Points3 result_pts;
480 double tolerance_sq = tolerance * tolerance;
481 if (!pts.empty()) {
482 const Point3* anchor = &pts.front();
483 size_t anchor_idx = 0;
484 const Point3* floater = &pts.back();
485 size_t floater_idx = pts.size() - 1;
486 result_pts.reserve(pts.size());
487 result_pts.emplace_back(*anchor);
488 if (anchor_idx != floater_idx) {
489 assert(pts.size() > 1);
490 std::vector<size_t> dpStack;
491 dpStack.reserve(pts.size());
492 dpStack.emplace_back(floater_idx);
493 for (;;) {
494 double max_dist_sq = 0.0;
495 size_t furthest_idx = anchor_idx;
496 // find point furthest from line seg created by (anchor, floater) and note it
497 for (size_t i = anchor_idx + 1; i < floater_idx; ++i) {
498 double dist_sq = Line3::distance_to_squared(pts[i], *anchor, *floater);
499 if (dist_sq > max_dist_sq) {
500 max_dist_sq = dist_sq;
501 furthest_idx = i;
502 }
503 }
504 // remove point if less than tolerance
505 if (max_dist_sq <= tolerance_sq) {
506 result_pts.emplace_back(*floater);
507 anchor_idx = floater_idx;
508 anchor = floater;
509 assert(dpStack.back() == floater_idx);
510 dpStack.pop_back();
511 if (dpStack.empty())
512 break;
513 floater_idx = dpStack.back();
514 } else {
515 floater_idx = furthest_idx;
516 dpStack.emplace_back(floater_idx);
517 }
518 floater = &pts[floater_idx];
519 }
520 }
521 assert(result_pts.front() == pts.front());
522 assert(result_pts.back() == pts.back());
523
524#if 0
525 {
526 static int iRun = 0;
527 BoundingBox bbox(pts);
528 BoundingBox bbox2(result_pts);
529 bbox.merge(bbox2);
530 SVG svg(debug_out_path("douglas_peucker_%d.svg", iRun ++).c_str(), bbox);
531 if (pts.front() == pts.back())
532 svg.draw(Polygon(pts), "black");
533 else
534 svg.draw(Polyline(pts), "black");
535 if (result_pts.front() == result_pts.back())
536 svg.draw(Polygon(result_pts), "green", scale_(0.1));
537 else
538 svg.draw(Polyline(result_pts), "green", scale_(0.1));
539 }
540#endif
541 }
542 return result_pts;
543}
static double distance_to_squared(const Point3 &point, const Point3 &a, const Point3 &b)
Definition Line.hpp:242
#define scale_(val)
Definition libslic3r.h:106
std::string debug_out_path(const char *name,...)
Definition utils.cpp:382
std::vector< Point3, PointsAllocator< Point3 > > Points3
Definition Point.hpp:76
Slic3r::Polygon Polygon
Definition Emboss.cpp:101

References Slic3r::debug_out_path(), Slic3r::Line3::distance_to_squared(), Slic3r::SVG::draw(), Slic3r::BoundingBoxBase< PointType, APointsType >::merge(), and scale_.

Referenced by Slic3r::Polyline3::simplify().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append() [1/3]

void Slic3r::MultiPoint3::append ( const Point3 & point)
inline
131{ this->points.push_back(point); }
Points3 points
Definition MultiPoint.hpp:129

Referenced by Slic3r::Polyline3::append(), Slic3r::Polyline3::append(), and Slic3r::Polyline3::append_before().

Here is the caller graph for this function:

◆ append() [2/3]

void Slic3r::MultiPoint3::append ( const Points3::const_iterator & begin,
const Points3::const_iterator & end )
inline
134 {
135 this->points.insert(this->points.end(), begin, end);
136 }
auto begin()
Definition MultiPoint.hpp:153
auto end()
Definition MultiPoint.hpp:154

References begin(), and end().

Here is the call graph for this function:

◆ append() [3/3]

void Slic3r::MultiPoint3::append ( const Vec3crd & point)
inline
132{ this->points.push_back(Point3(point)); }

◆ begin() [1/2]

auto Slic3r::MultiPoint3::begin ( )
inline
153{ return this->points.begin(); }

Referenced by append(), and Slic3r::Polyline3::split_at_index().

Here is the caller graph for this function:

◆ begin() [2/2]

auto Slic3r::MultiPoint3::begin ( ) const
inline
155{ return this->points.begin(); }

◆ bounding_box()

BoundingBox3 Slic3r::MultiPoint3::bounding_box ( ) const
452{ return BoundingBox3(this->points); }

References points.

◆ clear()

void Slic3r::MultiPoint3::clear ( )
inline
151{ this->points.clear(); }

Referenced by Slic3r::ExtrusionLoopSloped::ExtrusionLoopSloped(), Slic3r::FakeWipeTower::getFakeExtrusionPathsFromWipeTower2(), Slic3r::Polyline3::split_at_index(), and Slic3r::Polyline3::split_at_length().

Here is the caller graph for this function:

◆ empty()

bool Slic3r::MultiPoint3::empty ( ) const
inline

◆ end() [1/2]

auto Slic3r::MultiPoint3::end ( )
inline
154{ return this->points.end(); }

Referenced by append().

Here is the caller graph for this function:

◆ end() [2/2]

auto Slic3r::MultiPoint3::end ( ) const
inline
156{ return this->points.end(); }

◆ find_point() [1/4]

int Slic3r::MultiPoint3::find_point ( const Point & point) const
613{
614 for (const Point3 &pt : this->points)
615 if (pt.to_point() == point)
616 return int(&pt - &this->points.front());
617 return -1; // not found
618}

References points.

Referenced by find_point(), find_point(), Slic3r::Polyline3::split_at(), and Slic3r::Polyline3::split_at_length().

Here is the caller graph for this function:

◆ find_point() [2/4]

int Slic3r::MultiPoint3::find_point ( const Point & point,
const double scaled_epsilon ) const
621{
622 if (scaled_epsilon == 0) return this->find_point(point);
623
624 auto dist2_min = std::numeric_limits<double>::max();
625 auto eps2 = scaled_epsilon * scaled_epsilon;
626 int idx_min = -1;
627 for (const Point3 &pt : this->points) {
628 double d2 = (pt.to_point() - point).cast<double>().squaredNorm();
629 if (d2 < dist2_min) {
630 idx_min = int(&pt - &this->points.front());
631 dist2_min = d2;
632 }
633 }
634 return (dist2_min < eps2) ? idx_min : -1;
635}
int find_point(const Point &point) const
Definition MultiPoint.cpp:612

References find_point(), and points.

Here is the call graph for this function:

◆ find_point() [3/4]

int Slic3r::MultiPoint3::find_point ( const Point3 & point) const
638{
639 for (const Point3 &pt : this->points)
640 if (pt == point)
641 return int(&pt - &this->points.front());
642 return -1; // not found
643}

References points.

◆ find_point() [4/4]

int Slic3r::MultiPoint3::find_point ( const Point3 & point,
const double scaled_epsilon ) const
646{
647 if (scaled_epsilon == 0) return this->find_point(point);
648
649 auto dist2_min = std::numeric_limits<double>::max();
650 auto eps2 = scaled_epsilon * scaled_epsilon;
651 int idx_min = -1;
652 for (const Point3 &pt : this->points) {
653 double d2 = (pt - point).cast<double>().squaredNorm();
654 if (d2 < dist2_min) {
655 idx_min = int(&pt - &this->points.front());
656 dist2_min = d2;
657 }
658 }
659 return (dist2_min < eps2) ? idx_min : -1;
660}
auto cast(const BoundingBoxBase< Tin > &b)
Definition BoundingBox.hpp:299

References Slic3r::cast(), find_point(), and points.

Here is the call graph for this function:

◆ first_point() [1/2]

Point3 & Slic3r::MultiPoint3::first_point ( )
inline
145{ return this->points.front(); }

Referenced by Slic3r::Polyline3::append_before(), Slic3r::Polyline3::split_at(), Slic3r::Polyline3::split_at_index(), and Slic3r::Polyline3::split_at_length().

Here is the caller graph for this function:

◆ first_point() [2/2]

const Point3 & Slic3r::MultiPoint3::first_point ( ) const
inline
147{ return this->points.front(); }

◆ is_valid()

bool Slic3r::MultiPoint3::is_valid ( ) const
inline
160{ return this->points.size() >= 2; }

Referenced by Slic3r::Polyline3::append(), Slic3r::ExtrusionLoop::split_at(), Slic3r::Polyline3::split_at(), Slic3r::ExtrusionLoop::split_at_vertex(), and Slic3r::thick_polyline_to_multi_path().

Here is the caller graph for this function:

◆ last_point() [1/2]

Point3 & Slic3r::MultiPoint3::last_point ( )
inline
146{ return this->points.back(); }

Referenced by Slic3r::Polyline3::append(), Slic3r::Polyline3::clip_end(), Slic3r::Polyline3::split_at(), Slic3r::Polyline3::split_at_index(), and Slic3r::Polyline3::split_at_length().

Here is the caller graph for this function:

◆ last_point() [2/2]

const Point3 & Slic3r::MultiPoint3::last_point ( ) const
inline
148{ return this->points.back(); }

◆ length()

double Slic3r::MultiPoint3::length ( ) const
443{
444 const Lines3& lines = this->lines();
445 double len = 0;
446 for (auto it = lines.cbegin(); it != lines.cend(); ++it) {
447 len += it->length();
448 }
449 return len;
450}
virtual Lines3 lines() const =0
std::vector< Line3 > Lines3
Definition Line.hpp:21

References lines().

Referenced by Slic3r::ExtrusionLoopSloped::ExtrusionLoopSloped(), Slic3r::GCode::_extrude(), and Slic3r::Polyline3::split_at_length().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ lines()

virtual Lines3 Slic3r::MultiPoint3::lines ( ) const
pure virtual

Implemented in Slic3r::Polyline3.

Referenced by length().

Here is the caller graph for this function:

◆ remove_duplicate_points()

bool Slic3r::MultiPoint3::remove_duplicate_points ( )
455{
456 size_t j = 0;
457 for (size_t i = 1; i < points.size(); ++i) {
458 if (points[j] == points[i]) {
459 // Just increase index i.
460 } else {
461 ++ j;
462 if (j < i)
463 points[j] = points[i];
464 }
465 }
466
467 if (++j < points.size())
468 {
469 points.erase(points.begin() + j, points.end());
470 return true;
471 }
472
473 return false;
474}

References points.

◆ reverse()

void Slic3r::MultiPoint3::reverse ( )
inline
140{ std::reverse(this->points.begin(), this->points.end()); }

Referenced by Slic3r::Polyline3::append_before(), and Slic3r::Polyline3::reverse().

Here is the caller graph for this function:

◆ rotate() [1/3]

void Slic3r::MultiPoint3::rotate ( double angle)
inline
141{ this->rotate(cos(angle), sin(angle)); }
void rotate(double angle)
Definition MultiPoint.hpp:141
double angle(const Eigen::MatrixBase< Derived > &v1, const Eigen::MatrixBase< Derived2 > &v2)
Definition Point.hpp:138

References Slic3r::angle(), and rotate().

Referenced by rotate().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ rotate() [2/3]

void Slic3r::MultiPoint3::rotate ( double angle,
const Point3 & center )
601{
602 double s = sin(angle);
603 double c = cos(angle);
604 for (Point3 &pt : points) {
605 Vec3crd v(pt - center);
606 pt(0) = (coord_t)round(double(center(0)) + c * v[0] - s * v[1]);
607 pt(1) = (coord_t)round(double(center(1)) + c * v[1] + s * v[0]);
608 // Keep Z unchanged from original point
609 }
610}
int64_t coord_t
Definition libslic3r.h:48
void center(ExPolygonsWithIds &e)
Definition Emboss.cpp:1382
Eigen::Matrix< coord_t, 3, 1, Eigen::DontAlign > Vec3crd
Definition Point.hpp:53

References Slic3r::angle(), Slic3r::center(), and points.

Here is the call graph for this function:

◆ rotate() [3/3]

void Slic3r::MultiPoint3::rotate ( double cos_angle,
double sin_angle )
590{
591 for (Point3 &pt : this->points) {
592 double cur_x = double(pt(0));
593 double cur_y = double(pt(1));
594 pt(0) = coord_t(round(cos_angle * cur_x - sin_angle * cur_y));
595 pt(1) = coord_t(round(cos_angle * cur_y + sin_angle * cur_x));
596 // Keep Z unchanged
597 }
598}

References points.

◆ size()

size_t Slic3r::MultiPoint3::size ( ) const
inline
149{ return this->points.size(); }

Referenced by Slic3r::ExtrusionLoopSloped::ExtrusionLoopSloped(), Slic3r::Polyline3::append_before(), Slic3r::Polyline3::append_fitting_result_after_append_polyline(), Slic3r::Polyline3::clip_end(), Slic3r::paths_touch(), Slic3r::Polyline3::reverse(), Slic3r::ExtrusionPath::size(), and Slic3r::Polyline3::split_at_index().

Here is the caller graph for this function:

◆ translate() [1/2]

void Slic3r::MultiPoint3::translate ( const Point3 & vector)
437{
438 for (Point3& pt : points)
439 pt += v;
440}

References points.

◆ translate() [2/2]

void Slic3r::MultiPoint3::translate ( double x,
double y,
double z = 0 )
inline
138{ this->translate(Point3(coord_t(x), coord_t(y), coord_t(z))); }
void translate(double x, double y, double z=0)
Definition MultiPoint.hpp:138

References translate().

Referenced by translate().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ points

Points3 Slic3r::MultiPoint3::points

Referenced by Slic3r::Polyline3::Polyline3(), Slic3r::Polyline3::Polyline3(), Slic3r::GCode::_extrude(), Slic3r::Polyline3::append(), Slic3r::Polyline3::append_fitting_result_after_append_points(), bounding_box(), Slic3r::Polyline3::clip_end(), Slic3r::SupportMaterialInternal::collect_bridging_perimeter_areas(), Slic3r::ExtrusionLoop::collect_points(), Slic3r::ExtrusionMultiPath::collect_points(), Slic3r::ExtrusionPath::collect_points3(), Slic3r::contour_extrusion_path(), Slic3r::GCode::extrude_path(), Slic3r::ExtrusionSimulator::extrude_to_accumulator(), Slic3r::extrusion_entities_append_loops(), find_point(), find_point(), find_point(), find_point(), Slic3r::ExtrusionPath::first_point(), Slic3r::ExtrusionPath::first_point3(), Slic3r::FakeWipeTower::getFakeExtrusionPathsFromWipeTower2(), Slic3r::FakeWipeTower::getTrueExtrusionLayersFromWipeTower(), Slic3r::ExtrusionPath::is_closed(), Slic3r::ExtrusionPath::last_point(), Slic3r::ExtrusionPath::last_point3(), Slic3r::Polyline3::lines(), Slic3r::modulate_extrusion_by_overlapping_layers(), Slic3r::paths_touch(), remove_duplicate_points(), rotate(), rotate(), Slic3r::Polyline3::simplify(), Slic3r::Polyline3::simplify_by_fitting_arc(), Slic3r::ExtrusionLoop::split_at(), Slic3r::Polyline3::split_at(), Slic3r::Polyline3::split_at_index(), Slic3r::Polyline3::split_at_length(), Slic3r::ExtrusionLoop::split_at_vertex(), Slic3r::Polyline3::split_fitting_result_after_index(), Slic3r::Polyline3::split_fitting_result_before_index(), Slic3r::thick_polyline_to_multi_path(), Slic3r::Polyline3::to_polyline(), and translate().


The documentation for this class was generated from the following files: