PrusaSlicer-NonPlainar/src/libslic3r/BridgeDetector.hpp

69 lines
2.7 KiB
C++
Raw Normal View History

2014-11-15 21:41:22 +00:00
#ifndef slic3r_BridgeDetector_hpp_
#define slic3r_BridgeDetector_hpp_
#include "libslic3r.h"
2014-11-15 21:41:22 +00:00
#include "ExPolygon.hpp"
#include <string>
namespace Slic3r {
// The bridge detector optimizes a direction of bridges over a region or a set of regions.
// A bridge direction is considered optimal, if the length of the lines strang over the region is maximal.
// This is optimal if the bridge is supported in a single direction only, but
// it may not likely be optimal, if the bridge region is supported from all sides. Then an optimal
// solution would find a direction with shortest bridges.
// The bridge orientation is measured CCW from the X axis.
2014-11-15 21:41:22 +00:00
class BridgeDetector {
2016-09-26 10:53:41 +00:00
public:
// The non-grown holes.
const ExPolygons &expolygons;
// In case the caller gaves us the input polygons by a value, make a copy.
ExPolygons expolygons_owned;
2016-09-26 10:53:41 +00:00
// Lower slices, all regions.
const ExPolygons &lower_slices;
2016-09-26 10:53:41 +00:00
// Scaled extrusion width of the infill.
coord_t spacing;
2016-09-26 10:53:41 +00:00
// Angle resolution for the brute force search of the best bridging angle.
double resolution;
2016-09-26 10:53:41 +00:00
// The final optimal angle.
double angle;
2014-11-15 21:41:22 +00:00
BridgeDetector(ExPolygon _expolygon, const ExPolygons &_lower_slices, coord_t _extrusion_width);
BridgeDetector(const ExPolygons &_expolygons, const ExPolygons &_lower_slices, coord_t _extrusion_width);
// If bridge_direction_override != 0, then the angle is used instead of auto-detect.
bool detect_angle(double bridge_direction_override = 0.);
2015-10-26 22:23:03 +00:00
Polygons coverage(double angle = -1) const;
2014-11-15 21:41:22 +00:00
void unsupported_edges(double angle, Polylines* unsupported) const;
2015-10-26 22:23:03 +00:00
Polylines unsupported_edges(double angle = -1) const;
2014-11-15 21:41:22 +00:00
2016-09-26 10:53:41 +00:00
private:
// Suppress warning "assignment operator could not be generated"
BridgeDetector& operator=(const BridgeDetector &);
void initialize();
struct BridgeDirection {
BridgeDirection(double a = -1.) : angle(a), coverage(0.), max_length(0.) {}
// the best direction is the one causing most lines to be bridged (thus most coverage)
bool operator<(const BridgeDirection &other) const {
// Initial sort by coverage only - comparator must obey strict weak ordering
return this->coverage > other.coverage;
};
double angle;
double coverage;
double max_length;
};
// Get possible briging direction candidates.
std::vector<double> bridge_direction_candidates() const;
2016-09-26 10:53:41 +00:00
// Open lines representing the supporting edges.
Polylines _edges;
// Closed polygons representing the supporting areas.
ExPolygons _anchor_regions;
2014-11-15 21:41:22 +00:00
};
}
#endif