mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-15 21:55:59 +08:00
Fixed that fuzzy skin hadn't connected endpoints of extrusion when Arachne was used.
This commit is contained in:
parent
f3d0e3c399
commit
a09cf52798
@ -179,18 +179,21 @@ static void fuzzy_extrusion_line(Arachne::ExtrusionLine &ext_lines, double fuzzy
|
|||||||
const double range_random_point_dist = fuzzy_skin_point_dist / 2.;
|
const double range_random_point_dist = fuzzy_skin_point_dist / 2.;
|
||||||
double dist_left_over = double(rand()) * (min_dist_between_points / 2) / double(RAND_MAX); // the distance to be traversed on the line before making the first new point
|
double dist_left_over = double(rand()) * (min_dist_between_points / 2) / double(RAND_MAX); // the distance to be traversed on the line before making the first new point
|
||||||
|
|
||||||
auto * p0 = &ext_lines.junctions.back();
|
auto *p0 = &ext_lines.front();
|
||||||
std::vector<Arachne::ExtrusionJunction> out;
|
std::vector<Arachne::ExtrusionJunction> out;
|
||||||
out.reserve(ext_lines.size());
|
out.reserve(ext_lines.size());
|
||||||
for (auto &p1 : ext_lines)
|
for (auto &p1 : ext_lines) {
|
||||||
{ // 'a' is the (next) new point between p0 and p1
|
if (p0->p == p1.p) { // Connect endpoints.
|
||||||
|
out.emplace_back(p1.p, p1.w, p1.perimeter_index);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 'a' is the (next) new point between p0 and p1
|
||||||
Vec2d p0p1 = (p1.p - p0->p).cast<double>();
|
Vec2d p0p1 = (p1.p - p0->p).cast<double>();
|
||||||
double p0p1_size = p0p1.norm();
|
double p0p1_size = p0p1.norm();
|
||||||
// so that p0p1_size - dist_last_point evaulates to dist_left_over - p0p1_size
|
// so that p0p1_size - dist_last_point evaulates to dist_left_over - p0p1_size
|
||||||
double dist_last_point = dist_left_over + p0p1_size * 2.;
|
double dist_last_point = dist_left_over + p0p1_size * 2.;
|
||||||
for (double p0pa_dist = dist_left_over; p0pa_dist < p0p1_size;
|
for (double p0pa_dist = dist_left_over; p0pa_dist < p0p1_size; p0pa_dist += min_dist_between_points + double(rand()) * range_random_point_dist / double(RAND_MAX)) {
|
||||||
p0pa_dist += min_dist_between_points + double(rand()) * range_random_point_dist / double(RAND_MAX))
|
|
||||||
{
|
|
||||||
double r = double(rand()) * (fuzzy_skin_thickness * 2.) / double(RAND_MAX) - fuzzy_skin_thickness;
|
double r = double(rand()) * (fuzzy_skin_thickness * 2.) / double(RAND_MAX) - fuzzy_skin_thickness;
|
||||||
out.emplace_back(p0->p + (p0p1 * (p0pa_dist / p0p1_size) + perp(p0p1).cast<double>().normalized() * r).cast<coord_t>(), p1.w, p1.perimeter_index);
|
out.emplace_back(p0->p + (p0p1 * (p0pa_dist / p0p1_size) + perp(p0p1).cast<double>().normalized() * r).cast<coord_t>(), p1.w, p1.perimeter_index);
|
||||||
dist_last_point = p0pa_dist;
|
dist_last_point = p0pa_dist;
|
||||||
@ -198,6 +201,7 @@ static void fuzzy_extrusion_line(Arachne::ExtrusionLine &ext_lines, double fuzzy
|
|||||||
dist_left_over = p0p1_size - dist_last_point;
|
dist_left_over = p0p1_size - dist_last_point;
|
||||||
p0 = &p1;
|
p0 = &p1;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (out.size() < 3) {
|
while (out.size() < 3) {
|
||||||
size_t point_idx = ext_lines.size() - 2;
|
size_t point_idx = ext_lines.size() - 2;
|
||||||
out.emplace_back(ext_lines[point_idx].p, ext_lines[point_idx].w, ext_lines[point_idx].perimeter_index);
|
out.emplace_back(ext_lines[point_idx].p, ext_lines[point_idx].w, ext_lines[point_idx].perimeter_index);
|
||||||
@ -205,6 +209,10 @@ static void fuzzy_extrusion_line(Arachne::ExtrusionLine &ext_lines, double fuzzy
|
|||||||
break;
|
break;
|
||||||
-- point_idx;
|
-- point_idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ext_lines.back().p == ext_lines.front().p) // Connect endpoints.
|
||||||
|
out.back().p = out.front().p;
|
||||||
|
|
||||||
if (out.size() >= 3)
|
if (out.size() >= 3)
|
||||||
ext_lines.junctions = std::move(out);
|
ext_lines.junctions = std::move(out);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user