Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Faster (but less precise) implementation of simplify_by_visibility(),…
… since it was the bottleneck of avoid_crossing_perimeters. #2777
  • Loading branch information
alranel committed May 18, 2015
1 parent c64308a commit 70ec433
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 5 deletions.
27 changes: 24 additions & 3 deletions xs/src/libslic3r/Polyline.cpp
Expand Up @@ -139,11 +139,31 @@ Polyline::simplify_by_visibility(const T &area)
Points &pp = this->points;

// find first point in area
size_t start = 0;
while (start < pp.size() && !area.contains(pp[start])) {
start++;
size_t s = 0;
while (s < pp.size() && !area.contains(pp[s])) {
++s;
}

// find last point in area
size_t e = pp.size()-1;
while (e > 0 && !area.contains(pp[e])) {
--e;
}

// this ugly algorithm resembles a binary search
while (e > s + 1) {
size_t mid = (s + e) / 2;
if (area.contains(Line(pp[s], pp[mid]))) {
pp.erase(pp.begin() + s + 1, pp.begin() + mid);
// repeat recursively until no further simplification is possible
++s;
e = pp.size()-1;
} else {
e = mid;
}
}
/*
// The following implementation is complete but it's not efficient at all:
for (size_t s = start; s < pp.size() && !pp.empty(); ++s) {
// find the farthest point to which we can build
// a line that is contained in the supplied area
Expand All @@ -158,6 +178,7 @@ Polyline::simplify_by_visibility(const T &area)
}
}
}
*/
}
template void Polyline::simplify_by_visibility<ExPolygon>(const ExPolygon &area);
template void Polyline::simplify_by_visibility<ExPolygonCollection>(const ExPolygonCollection &area);
Expand Down
5 changes: 3 additions & 2 deletions xs/t/09_polyline.t
Expand Up @@ -4,7 +4,7 @@ use strict;
use warnings;

use Slic3r::XS;
use Test::More tests => 21;
use Test::More tests => 18;

my $points = [
[100, 100],
Expand Down Expand Up @@ -88,7 +88,8 @@ is_deeply $polyline->pp, [ @$points, @$points ], 'append_polyline';
is scalar(@$p2), 4, 'split_at';
}

{
# disabled because we now use a more efficient but incomplete algorithm
if (0) {
my $polyline = Slic3r::Polyline->new(
map [$_,10], (0,10,20,30,40,50,60)
);
Expand Down

0 comments on commit 70ec433

Please sign in to comment.