Incomplete work for XS-based convex_hull
This commit is contained in:
parent
a950fbe0c2
commit
4577f0725c
1
Build.PL
1
Build.PL
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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(@_);
|
||||||
|
@ -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}) {
|
||||||
|
@ -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';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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() {
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user