Add safety offset to thin wall regions to prevent overlapping geometry and corrupt Voronoi diagram
This commit is contained in:
parent
e1f93fd112
commit
4a894b1e20
2 changed files with 3 additions and 4 deletions
|
@ -99,6 +99,7 @@ sub make_perimeters {
|
||||||
my $diff = diff_ex(
|
my $diff = diff_ex(
|
||||||
\@last,
|
\@last,
|
||||||
offset(\@offsets, +0.5*$pwidth),
|
offset(\@offsets, +0.5*$pwidth),
|
||||||
|
1, # medial axis requires non-overlapping geometry
|
||||||
);
|
);
|
||||||
push @thin_walls, @$diff;
|
push @thin_walls, @$diff;
|
||||||
}
|
}
|
||||||
|
@ -222,9 +223,6 @@ sub make_perimeters {
|
||||||
$self->perimeters->append(@loops);
|
$self->perimeters->append(@loops);
|
||||||
|
|
||||||
# process thin walls by collapsing slices to single passes
|
# process thin walls by collapsing slices to single passes
|
||||||
my $min_thin_wall_width = $pwidth/3;
|
|
||||||
my $min_thin_wall_length = 2*$pwidth;
|
|
||||||
#@thin_walls = @{offset2_ex([ map @$_, @thin_walls ], -0.5*$min_thin_wall_width, +0.5*$min_thin_wall_width)};
|
|
||||||
if (@thin_walls) {
|
if (@thin_walls) {
|
||||||
my @p = map @{$_->medial_axis($pspacing)}, @thin_walls;
|
my @p = map @{$_->medial_axis($pspacing)}, @thin_walls;
|
||||||
|
|
||||||
|
@ -240,6 +238,7 @@ sub make_perimeters {
|
||||||
}
|
}
|
||||||
|
|
||||||
my @paths = ();
|
my @paths = ();
|
||||||
|
my $min_thin_wall_length = 2*$pwidth;
|
||||||
for my $p (@p) {
|
for my $p (@p) {
|
||||||
next if $p->length < $min_thin_wall_length;
|
next if $p->length < $min_thin_wall_length;
|
||||||
my %params = (
|
my %params = (
|
||||||
|
|
|
@ -237,7 +237,7 @@ MedialAxis::is_valid_edge(const VD::edge_type& edge) const
|
||||||
// if we only process segments representing closed loops, none if the
|
// if we only process segments representing closed loops, none if the
|
||||||
// infinite edges (if any) would be part of our MAT anyway
|
// infinite edges (if any) would be part of our MAT anyway
|
||||||
if (edge.is_secondary() || edge.is_infinite()) return false;
|
if (edge.is_secondary() || edge.is_infinite()) return false;
|
||||||
|
|
||||||
/* If the cells sharing this edge have a common vertex, we're not interested
|
/* If the cells sharing this edge have a common vertex, we're not interested
|
||||||
in this edge. Why? Because it means that the edge lies on the bisector of
|
in this edge. Why? Because it means that the edge lies on the bisector of
|
||||||
two contiguous input lines and it was included in the Voronoi graph because
|
two contiguous input lines and it was included in the Voronoi graph because
|
||||||
|
|
Loading…
Reference in a new issue