From: Ian Jackson Date: Sun, 25 Nov 2018 13:30:15 +0000 (+0000) Subject: distort-stl: new approach: split longest edge (does not work yet) X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=reprap-play.git;a=commitdiff_plain;h=f5e5bb227ce24bc8faa92c700583f7a06bc894d0;ds=sidebyside distort-stl: new approach: split longest edge (does not work yet) Signed-off-by: Ian Jackson --- diff --git a/distort-stl b/distort-stl index 9d85690..8167e35 100755 --- a/distort-stl +++ b/distort-stl @@ -85,44 +85,57 @@ sub maybe_subdivide_triangle ($$$$) { my ($t, $ok, $changed, $edge_need_subdivide_fn) = @_; print STDERR sprintf_triangle $t if $debug; - + + my (@longest) = qw(-1); + foreach my $ix (0..2) { my $jx = ($ix+1) % 3; - my $kx = ($ix+2) % 3; - if ($edge_need_subdivide_fn->($t->[$ix], $t->[$jx])) { - printf STDERR - " S i=%d j=%d k=%d ", - $ix, $jx, $kx - if $debug; - my @midp; - foreach my $ci (0..2) { - push @midp, 0.5 * ($t->[$ix][$ci] + $t->[$jx][$ci]); - } - - printf STDERR - " midp %11.6f,%11.6f,%11.6f\n", - @midp - if $debug; - - # triangle i-j-k, splitting edge i-m - # gives i-m-k, k-m-j - my $gensplit = sub { - my ($ixjx, $xwhat) = @_; - my $n = [ @$t ]; - $n->[$ixjx] = \@midp; - $n->[3] = "$t->[3]$xwhat"; - printf STDERR "%s\n", sprintf_triangle $n if $debug; - unshift @$changed, $n; - }; - $gensplit->($ix, "a$ix$jx"); - $gensplit->($jx, "b$ix$jx"); - return; + next unless $edge_need_subdivide_fn->($t->[$ix], $t->[$jx]); + my $l2 = 0; + foreach my $ci (0..2) { + my $d = $t->[$ix][$ci] - $t->[$jx][$ci]; + $l2 += $d*$d; } + next unless $l2 > $longest[0]; + @longest = ($l2, $ix, $jx); } - push @$ok, $t; - printf STDERR "OK nok=%d nchanged=%d\n", - (scalar @$ok), (scalar @$changed) + if ($longest[0] < 0) { + push @$ok, $t; + printf STDERR "OK nok=%d nchanged=%d\n", + (scalar @$ok), (scalar @$changed) + if $debug; + return; + } + my ($dummy,$ix,$jx) = @longest; + my $kx = ($ix+2) % 3; + + printf STDERR + " S i=%d j=%d k=%d ", + $ix, $jx, $kx if $debug; + my @midp; + foreach my $ci (0..2) { + push @midp, 0.5 * ($t->[$ix][$ci] + $t->[$jx][$ci]); + } + + printf STDERR + " midp %11.6f,%11.6f,%11.6f\n", + @midp + if $debug; + + # triangle i-j-k, splitting edge i-m + # gives i-m-k, k-m-j + my $gensplit = sub { + my ($ixjx, $xwhat) = @_; + my $n = [ @$t ]; + $n->[$ixjx] = \@midp; + $n->[3] = "$t->[3]$xwhat"; + printf STDERR "%s\n", sprintf_triangle $n if $debug; + unshift @$changed, $n; + }; + $gensplit->($ix, "a$ix$jx"); + $gensplit->($jx, "b$ix$jx"); + return; } sub maybe_subdivide ($) {