From 802ebfb0d6fcbee495860b4ccf4ed86e084bc8e3 Mon Sep 17 00:00:00 2001 From: Petr Ledvina Date: Wed, 23 Apr 2014 11:04:56 +0200 Subject: [PATCH 1/2] Fix bridge detector Test line direction is changed to reflect 0=east angle system Test patern rotation direction is reversed - $angle represents infill direction Angle test is changed to avoid returning negative value (this does happen otherwise - adding increments to $angle creates ~ 1e-15 rounding error) --- lib/Slic3r/Layer/BridgeDetector.pm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/Slic3r/Layer/BridgeDetector.pm b/lib/Slic3r/Layer/BridgeDetector.pm index ccb4119ea..54e4c9b4d 100644 --- a/lib/Slic3r/Layer/BridgeDetector.pm +++ b/lib/Slic3r/Layer/BridgeDetector.pm @@ -89,16 +89,16 @@ sub detect_angle { my $my_anchors = [ map $_->clone, @$anchors ]; # rotate everything - the center point doesn't matter - $_->rotate($angle, [0,0]) for @$my_clip_area, @$my_anchors; + $_->rotate(-$angle, [0,0]) for @$my_clip_area, @$my_anchors; # generate lines in this direction my $bounding_box = Slic3r::Geometry::BoundingBox->new_from_points([ map @$_, map @$_, @$my_anchors ]); my @lines = (); - for (my $x = $bounding_box->x_min; $x <= $bounding_box->x_max; $x += $line_increment) { + for (my $y = $bounding_box->y_min; $y <= $bounding_box->y_max; $y+= $line_increment) { push @lines, Slic3r::Polyline->new( - [$x, $bounding_box->y_min + scaled_epsilon], - [$x, $bounding_box->y_max - scaled_epsilon], + [$bounding_box->x_min, $y], + [$bounding_box->x_max, $y], ); } @@ -143,7 +143,7 @@ sub detect_angle { } if (defined $self->angle) { - if ($self->angle >= PI - epsilon) { + if ($self->angle >= PI) { $self->angle($self->angle - PI); } From 4c1ffecfc4defa2bbbbedadcad016ab66d6c3e5a Mon Sep 17 00:00:00 2001 From: Petr Ledvina Date: Wed, 23 Apr 2014 11:40:37 +0200 Subject: [PATCH 2/2] Fix test to check for correct direction and accept result close to 180 degrees. --- t/bridges.t | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/t/bridges.t b/t/bridges.t index 557175f2f..ff20af2fe 100644 --- a/t/bridges.t +++ b/t/bridges.t @@ -30,8 +30,8 @@ use Slic3r::Test; ok check_angle([$lower], $bridge, $expected_angle, $tolerance), 'correct bridge angle for O-shaped overhang'; }; - $test->([20,10], 0, 0); - $test->([10,20], 0, 90); + $test->([20,10], 0, 90); + $test->([10,20], 0, 0); $test->([20,10], 45, 135, 20); $test->([20,10], 135, 45, 20); } @@ -81,7 +81,10 @@ sub check_angle { # our epsilon is equal to the steps used by the bridge detection algorithm ###use XXX; YYY [ rad2deg($result), $expected ]; - return defined $result && abs(rad2deg($result) - $expected) < $tolerance; + # returned value must be non-negative, check for that too + my $delta=rad2deg($result) - $expected; + $delta-=180 if $delta>=180 - epsilon; + return defined $result && $result>=0 && abs($delta) < $tolerance; } __END__