Incomplete work for XS-based convex_hull

This commit is contained in:
Alessandro Ranellucci 2013-11-22 21:43:35 +01:00
parent a950fbe0c2
commit 4577f0725c
9 changed files with 38 additions and 28 deletions

View File

@ -13,7 +13,6 @@ my %prereqs = qw(
File::Basename 0 File::Basename 0
File::Spec 0 File::Spec 0
Getopt::Long 0 Getopt::Long 0
Math::ConvexHull::MonotoneChain 0.01
Math::Geometry::Voronoi 1.3 Math::Geometry::Voronoi 1.3
Math::PlanePath 53 Math::PlanePath 53
Moo 1.003001 Moo 1.003001

View File

@ -73,7 +73,7 @@ sub flush_path {
$$buffer =~ s/^/;/mg; $$buffer =~ s/^/;/mg;
$gcode = "; these moves were replaced by an arc:\n" . $$buffer; $gcode = "; these moves were replaced by an arc:\n" . $$buffer;
my $orientation = Slic3r::Geometry::point_is_on_left_of_segment($cur_path->[2], [ @$cur_path[0,1] ]) ? 'ccw' : 'cw'; my $orientation = $cur_path->[2]->ccw(@$cur_path[0,1]) ? 'ccw' : 'cw';
# to find the center, we intersect the perpendicular lines # to find the center, we intersect the perpendicular lines
# passing by midpoints of $s1 and last segment # passing by midpoints of $s1 and last segment

View File

@ -6,8 +6,7 @@ use utf8;
use File::Basename qw(basename dirname); use File::Basename qw(basename dirname);
use List::Util qw(max sum first); use List::Util qw(max sum first);
use Slic3r::Geometry::Clipper qw(offset JT_ROUND); use Slic3r::Geometry::Clipper qw(offset JT_ROUND);
use Math::ConvexHull::MonotoneChain qw(convex_hull); use Slic3r::Geometry qw(X Y Z MIN MAX convex_hull);
use Slic3r::Geometry qw(X Y Z MIN MAX);
use threads::shared qw(shared_clone); use threads::shared qw(shared_clone);
use Wx qw(:bitmap :brush :button :cursor :dialog :filedialog :font :keycode :icon :id :listctrl :misc :panel :pen :sizer :toolbar :window); use Wx qw(:bitmap :brush :button :cursor :dialog :filedialog :font :keycode :icon :id :listctrl :misc :panel :pen :sizer :toolbar :window);
use Wx::Event qw(EVT_BUTTON EVT_COMMAND EVT_KEY_DOWN EVT_LIST_ITEM_ACTIVATED EVT_LIST_ITEM_DESELECTED EVT_LIST_ITEM_SELECTED EVT_MOUSE_EVENTS EVT_PAINT EVT_TOOL EVT_CHOICE); use Wx::Event qw(EVT_BUTTON EVT_COMMAND EVT_KEY_DOWN EVT_LIST_ITEM_ACTIVATED EVT_LIST_ITEM_DESELECTED EVT_LIST_ITEM_SELECTED EVT_MOUSE_EVENTS EVT_PAINT EVT_TOOL EVT_CHOICE);
@ -991,7 +990,7 @@ sub repaint {
# if sequential printing is enabled and we have more than one object # if sequential printing is enabled and we have more than one object
if ($parent->{config}->complete_objects && (map @{$_->instances}, @{$parent->{objects}}) > 1) { if ($parent->{config}->complete_objects && (map @{$_->instances}, @{$parent->{objects}}) > 1) {
my $convex_hull = Slic3r::Polygon->new(@{convex_hull([ map @{$_->contour->pp}, @{$parent->{object_previews}->[-1][2]} ])}); my $convex_hull = convex_hull([ map @{$_->contour}, @{$parent->{object_previews}->[-1][2]} ]);
my ($clearance) = @{offset([$convex_hull], $parent->{config}->extruder_clearance_radius / 2 * $parent->{scaling_factor}, 100, JT_ROUND)}; my ($clearance) = @{offset([$convex_hull], $parent->{config}->extruder_clearance_radius / 2 * $parent->{scaling_factor}, 100, JT_ROUND)};
$dc->SetPen($parent->{clearance_pen}); $dc->SetPen($parent->{clearance_pen});
$dc->SetBrush($parent->{transparent_brush}); $dc->SetBrush($parent->{transparent_brush});
@ -1255,7 +1254,6 @@ package Slic3r::GUI::Plater::Object;
use Moo; use Moo;
use List::Util qw(first); use List::Util qw(first);
use Math::ConvexHull::MonotoneChain qw();
use Slic3r::Geometry qw(X Y Z MIN MAX deg2rad); use Slic3r::Geometry qw(X Y Z MIN MAX deg2rad);
has 'name' => (is => 'rw', required => 1); has 'name' => (is => 'rw', required => 1);
@ -1291,7 +1289,7 @@ sub _trigger_model_object {
my $mesh = $model_object->mesh; my $mesh = $model_object->mesh;
$mesh->repair; $mesh->repair;
$self->convex_hull(Slic3r::Polygon->new(@{Math::ConvexHull::MonotoneChain::convex_hull($mesh->vertices)})); $self->convex_hull(Slic3r::Geometry::convex_hull($mesh->vertices));
$self->facets($mesh->facets_count); $self->facets($mesh->facets_count);
$self->vertices(scalar @{$mesh->vertices}); $self->vertices(scalar @{$mesh->vertices});
$self->materials($model_object->materials_count); $self->materials($model_object->materials_count);

View File

@ -9,7 +9,7 @@ our @EXPORT_OK = qw(
line_point_belongs_to_segment points_coincide distance_between_points line_point_belongs_to_segment points_coincide distance_between_points
chained_path_items chained_path_points normalize tan move_points_3D chained_path_items chained_path_points normalize tan move_points_3D
point_in_polygon point_in_segment segment_in_segment point_in_polygon point_in_segment segment_in_segment
point_is_on_left_of_segment polyline_lines polygon_lines polyline_lines polygon_lines
point_along_segment polygon_segment_having_point polygon_has_subsegment point_along_segment polygon_segment_having_point polygon_has_subsegment
deg2rad rad2deg deg2rad rad2deg
rotate_points move_points rotate_points move_points
@ -20,6 +20,7 @@ our @EXPORT_OK = qw(
rad2deg_dir bounding_box_center line_intersects_any douglas_peucker rad2deg_dir bounding_box_center line_intersects_any douglas_peucker
polyline_remove_short_segments normal triangle_normal polygon_is_convex polyline_remove_short_segments normal triangle_normal polygon_is_convex
scaled_epsilon bounding_box_3D size_3D size_2D scaled_epsilon bounding_box_3D size_3D size_2D
convex_hull
); );
@ -174,13 +175,6 @@ sub segment_in_segment {
return point_in_segment($needle->[A], $haystack) && point_in_segment($needle->[B], $haystack); return point_in_segment($needle->[A], $haystack) && point_in_segment($needle->[B], $haystack);
} }
sub point_is_on_left_of_segment {
my ($point, $line) = @_;
return (($line->[B][X] - $line->[A][X])*($point->[Y] - $line->[A][Y])
- ($line->[B][Y] - $line->[A][Y])*($point->[X] - $line->[A][X])) > 0;
}
sub polyline_lines { sub polyline_lines {
my ($polyline) = @_; my ($polyline) = @_;
my @points = @$polyline; my @points = @$polyline;

View File

@ -23,12 +23,6 @@ sub intersection {
return Slic3r::Geometry::line_intersection($self, $line, $require_crossing); return Slic3r::Geometry::line_intersection($self, $line, $require_crossing);
} }
sub point_on_left {
my $self = shift;
my ($point) = @_;
return Slic3r::Geometry::point_is_on_left_of_segment($point, $self);
}
sub grow { sub grow {
my $self = shift; my $self = shift;
return Slic3r::Polyline->new(@$self)->grow(@_); return Slic3r::Polyline->new(@$self)->grow(@_);

View File

@ -4,9 +4,9 @@ use Moo;
use File::Basename qw(basename fileparse); use File::Basename qw(basename fileparse);
use File::Spec; use File::Spec;
use List::Util qw(min max first); use List::Util qw(min max first);
use Math::ConvexHull::MonotoneChain qw(convex_hull);
use Slic3r::ExtrusionPath ':roles'; use Slic3r::ExtrusionPath ':roles';
use Slic3r::Geometry qw(X Y Z X1 Y1 X2 Y2 MIN MAX PI scale unscale move_points chained_path); use Slic3r::Geometry qw(X Y Z X1 Y1 X2 Y2 MIN MAX PI scale unscale move_points chained_path
convex_hull);
use Slic3r::Geometry::Clipper qw(diff_ex union_ex union_pt intersection_ex intersection offset use Slic3r::Geometry::Clipper qw(diff_ex union_ex union_pt intersection_ex intersection offset
offset2 traverse_pt JT_ROUND JT_SQUARE); offset2 traverse_pt JT_ROUND JT_SQUARE);
use Time::HiRes qw(gettimeofday tv_interval); use Time::HiRes qw(gettimeofday tv_interval);
@ -174,8 +174,9 @@ sub validate {
for my $obj_idx (0 .. $#{$self->objects}) { for my $obj_idx (0 .. $#{$self->objects}) {
my $clearance; my $clearance;
{ {
my @points = map [ @$_[X,Y] ], map @{$_->vertices}, @{$self->objects->[$obj_idx]->meshes}; my @points = map Slic3r::Point->new(@$_[X,Y]), map @{$_->vertices}, @{$self->objects->[$obj_idx]->meshes};
my $convex_hull = Slic3r::Polygon->new(@{convex_hull(\@points)}); my $convex_hull = convex_hull(\@points);
use XXX; YYY ($convex_hull->pp);
($clearance) = @{offset([$convex_hull], scale $Slic3r::Config->extruder_clearance_radius / 2, 1, JT_ROUND)}; ($clearance) = @{offset([$convex_hull], scale $Slic3r::Config->extruder_clearance_radius / 2, 1, JT_ROUND)};
} }
for my $copy (@{$self->objects->[$obj_idx]->copies}) { for my $copy (@{$self->objects->[$obj_idx]->copies}) {

View File

@ -8,9 +8,8 @@ BEGIN {
} }
use List::Util qw(first); use List::Util qw(first);
use Math::ConvexHull::MonotoneChain qw(convex_hull);
use Slic3r; use Slic3r;
use Slic3r::Geometry qw(scale); use Slic3r::Geometry qw(scale convex_hull);
use Slic3r::Test; use Slic3r::Test;
{ {
@ -54,7 +53,7 @@ use Slic3r::Test;
$point->translate(map scale($_), @{ $config->extruder_offset->[$tool] }); $point->translate(map scale($_), @{ $config->extruder_offset->[$tool] });
} }
}); });
my $convex_hull = Slic3r::Polygon->new(@{convex_hull([ map $_->pp, @extrusion_points ])}); my $convex_hull = convex_hull(\@extrusion_points);
ok !(first { $convex_hull->contains_point($_) } @toolchange_points), 'all toolchanges happen outside skirt'; ok !(first { $convex_hull->contains_point($_) } @toolchange_points), 'all toolchanges happen outside skirt';
} }

View File

@ -90,6 +90,28 @@ Point::distance_to(const Line &line) const
return std::abs(n) / line.length(); return std::abs(n) / line.length();
} }
/* Three points are a counter-clockwise turn if ccw > 0, clockwise if
* ccw < 0, and collinear if ccw = 0 because ccw is a determinant that
* gives the signed area of the triangle formed by p1, p2 and this point.
*/
double
Point::ccw(const Point &p1, const Point &p2) const
{
return (p2.x - p1.x)*(this->y - p1.y) - (p2.y - p1.y)*(this->x - p1.x);
}
double
Point::ccw(const Point* p1, const Point* p2) const
{
return this->ccw(*p1, *p2);
}
double
Point::ccw(const Line &line) const
{
return this->ccw(line.a, line.b);
}
#ifdef SLIC3RXS #ifdef SLIC3RXS
SV* SV*
Point::to_SV_ref() { Point::to_SV_ref() {

View File

@ -26,6 +26,9 @@ class Point
double distance_to(const Point* point) const; double distance_to(const Point* point) const;
double distance_to(const Line* line) const; double distance_to(const Line* line) const;
double distance_to(const Line &line) const; double distance_to(const Line &line) const;
double ccw(const Point &p1, const Point &p2) const;
double ccw(const Point* p1, const Point* p2) const;
double ccw(const Line &line) const;
#ifdef SLIC3RXS #ifdef SLIC3RXS
void from_SV(SV* point_sv); void from_SV(SV* point_sv);