mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-17 11:47:54 -06:00
Initial port of organic tree support from PrusaSlicer (#1938)
* Initial port of organic tree support from PrusaSlicer * Port missing Organic support parameters from PrusaSlicer * Update parameter naming * Reorganize the `raft_first_layer_expansion` and `raft_first_layer_density` parameters as they are not only used by rafts * Reset support style only in simple mode * Sync latest update from PrusaSlicer & copyrights * Fix organic tree support crash with invalid parameters --------- Co-authored-by: Vojtech Bubnik <bubnikv@gmail.com>
This commit is contained in:
parent
b50dfb69a2
commit
a1464735ce
33 changed files with 13299 additions and 38 deletions
|
@ -594,7 +594,7 @@ void remove_collinear(Polygons &polys)
|
|||
remove_collinear(poly);
|
||||
}
|
||||
|
||||
Polygons polygons_simplify(const Polygons &source_polygons, double tolerance)
|
||||
Polygons polygons_simplify(const Polygons &source_polygons, double tolerance, bool strictly_simple /* = true */)
|
||||
{
|
||||
Polygons out;
|
||||
out.reserve(source_polygons.size());
|
||||
|
@ -605,7 +605,7 @@ Polygons polygons_simplify(const Polygons &source_polygons, double tolerance)
|
|||
simplified.pop_back();
|
||||
// Simplify the decimated contour by ClipperLib.
|
||||
bool ccw = ClipperLib::Area(simplified) > 0.;
|
||||
for (Points &path : ClipperLib::SimplifyPolygons(ClipperUtils::SinglePathProvider(simplified), ClipperLib::pftNonZero)) {
|
||||
for (Points &path : ClipperLib::SimplifyPolygons(ClipperUtils::SinglePathProvider(simplified), ClipperLib::pftNonZero, strictly_simple)) {
|
||||
if (! ccw)
|
||||
// ClipperLib likely reoriented negative area contours to become positive. Reverse holes back to CW.
|
||||
std::reverse(path.begin(), path.end());
|
||||
|
@ -664,4 +664,24 @@ bool contains(const Polygons &polygons, const Point &p, bool border_result)
|
|||
}
|
||||
return (poly_count_inside % 2) == 1;
|
||||
}
|
||||
|
||||
Polygon make_circle(double radius, double error)
|
||||
{
|
||||
double angle = 2. * acos(1. - error / radius);
|
||||
size_t num_segments = size_t(ceil(2. * M_PI / angle));
|
||||
return make_circle_num_segments(radius, num_segments);
|
||||
}
|
||||
|
||||
Polygon make_circle_num_segments(double radius, size_t num_segments)
|
||||
{
|
||||
Polygon out;
|
||||
out.points.reserve(num_segments);
|
||||
double angle_inc = 2.0 * M_PI / num_segments;
|
||||
for (size_t i = 0; i < num_segments; ++ i) {
|
||||
const double angle = angle_inc * i;
|
||||
out.points.emplace_back(coord_t(cos(angle) * radius), coord_t(sin(angle) * radius));
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue