76{
77 if (this->
_edges.empty() || this->_anchor_regions.empty())
78
79 return false;
80
81 std::vector<BridgeDirection> candidates;
82 if (bridge_direction_override == 0.) {
84 candidates.reserve(angles.size());
85 for (size_t i = 0; i < angles.size(); ++ i)
86 candidates.emplace_back(BridgeDirection(angles[i]));
87 } else
88 candidates.emplace_back(BridgeDirection(bridge_direction_override));
89
90
91
92
94
95
96
97
98
99 bool have_coverage = false;
100 for (size_t i_angle = 0; i_angle < candidates.size(); ++ i_angle)
101 {
102 const double angle = candidates[i_angle].angle;
103
105 {
106
108
109 lines.reserve((bbox.max(1) - bbox.min(1) + this->spacing) / this->spacing);
112
113
114
116 lines.push_back(Line(
119 }
120
122 double max_length = 0;
123 {
125 for (size_t i = 0; i < clipped_lines.size(); ++i) {
126 const Line &line = clipped_lines[i];
128
129 double len = line.length();
131 max_length = std::max(max_length, len);
132 }
133 }
134 }
136 continue;
137
138 have_coverage = true;
139
141
142
143
144
145 candidates[i_angle].max_length = max_length;
146 }
147
148
149 if (! have_coverage)
150 return false;
151
152
153 std::sort(candidates.begin(), candidates.end());
154
155
156
157 size_t i_best = 0;
158 for (
size_t i = 1; i < candidates.size() && candidates[i_best].
coverage - candidates[i].coverage < this->
spacing; ++ i)
159 if (candidates[i].max_length < candidates[i_best].max_length)
160 i_best = i;
161
162 this->angle = candidates[i_best].angle;
163 if (this->angle >=
PI)
165
166 #ifdef SLIC3R_DEBUG
168 #endif
169
170 return true;
171}
EIGEN_DEVICE_FUNC const CosReturnType cos() const
Definition ArrayCwiseUnaryOps.h:202
EIGEN_DEVICE_FUNC const SinReturnType sin() const
Definition ArrayCwiseUnaryOps.h:220
EIGEN_DEVICE_FUNC const RoundReturnType round() const
Definition ArrayCwiseUnaryOps.h:374
std::vector< double > bridge_direction_candidates() const
Definition BridgeDetector.cpp:173
Polygons coverage(double angle=-1) const
Definition BridgeDetector.cpp:270
int32_t coord_t
Definition libslic3r.h:39
const Scalar & y
Definition MathFunctions.h:552
T rad2deg(T angle)
Definition Geometry.hpp:288
bool expolygons_contain(ExPolygons &expolys, const Point &pt, bool border_result=true)
Definition ExPolygon.hpp:433
Slic3r::Polygons offset(const Slic3r::Polygon &polygon, const float delta, ClipperLib::JoinType joinType, double miterLimit)
Definition ClipperUtils.cpp:416
double total_length(const Polygons &polylines)
Definition Polygon.hpp:112
BoundingBox get_extents_rotated(const ExPolygon &expolygon, double angle)
Definition ExPolygon.cpp:368
Kernel::Point_2 Point
Definition point_areas.cpp:20