X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=reprap-play.git;a=blobdiff_plain;f=distort-stl;h=68290c410a6ae4738d680d6409abd8f3464c008e;hp=68b7e28d79fa731b05cb6d9205319ab8b819db57;hb=f1824fce4c0b4420e0ba377d8d8a4e43e42e4a7d;hpb=6562f4b2558c850a0c98b71971b2569b401d4a95 diff --git a/distort-stl b/distort-stl index 68b7e28..68290c4 100755 --- a/distort-stl +++ b/distort-stl @@ -32,6 +32,14 @@ use Data::Dumper; sub TAU () { M_PI * 2; } +our $debug = $ENV{DISTORT_DEBUG} // 0 ; + +my $ps = $ENV{DISTORT_PS}; +if ($ps) { + open PS, "> $ps" or die $!; + print PS "%!\n"; +} + our $fa = 10; our $triangles; @@ -47,6 +55,22 @@ sub shift_arg () { sub sprintf_triangle ($) { my ($t) = @_; + return '' unless $debug; + + if ($ps && $t->[3] =~ m/$ENV{DISTORT_PS_RE}/) { + printf PS <<'END', + %20.16g %20.16g %20.16g moveto + %20.16g %20.16g %20.16g lineto + %20.16g %20.16g %20.16g lineto + closepath stroke +END + $t->[0][0], $t->[0][1], $t->[0][2], + $t->[1][0], $t->[1][1], $t->[1][2], + $t->[2][0], $t->[2][1], $t->[2][2], + or die $!; + flush PS or die $!; + } + sprintf "%11.6f,%11.6f,%11.6f / ". "%11.6f,%11.6f,%11.6f / ". @@ -60,42 +84,59 @@ sub sprintf_triangle ($) { sub maybe_subdivide_triangle ($$$$) { my ($t, $ok, $changed, $edge_need_subdivide_fn) = @_; - print STDERR sprintf_triangle $t; - - 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; - 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; - - # triangle i-j-k, splitting edge i-m - # gives i-m-k, k-m-j - my $n = [ @$t ]; $n->[$ix] = \@midp; $n->[3] = "$t->[3]a$ix$jx"; - unshift @$changed, $n; - - printf STDERR "%s\n", sprintf_triangle $n; - - my $n = [ @$t ]; $n->[$jx] = \@midp; $n->[3] = "$t->[3]b$ix$jx"; - unshift @$changed, $n; + print STDERR sprintf_triangle $t if $debug; - printf STDERR "%s\n", sprintf_triangle $n; + my (@longest) = qw(-1); - return; + foreach my $ix (0..2) { + my $jx = ($ix+1) % 3; + 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); + } + if ($longest[0] < 0) { + push @$ok, $t; + printf STDERR "OK nok=%d nchanged=%d\n", + (scalar @$ok), (scalar @$changed) + if $debug; + print STDERR Dumper(\@$ok) if $debug>=2; + return; } - push @$ok, $t; - printf STDERR "OK nok=%d nchanged=%d\n", - (scalar @$ok), (scalar @$changed); + 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 ($) { @@ -139,7 +180,7 @@ sub project_cylinder_tri { my $radius = $project_cylinder_radius; my @ot; - foreach my $p (@$t) { + foreach my $p (@$t[0..2]) { my ($x,$y,$z) = @$p; my $r = $radius - $y; my $theta = $x / $radius; @@ -147,6 +188,7 @@ sub project_cylinder_tri { -$r * cos($theta), $z ]; } + push @ot, $t->[3].'P'; append_triangle \@ot; } @@ -234,8 +276,8 @@ print "solid distort-stl\n"; foreach my $t (@$triangles) { print " facet normal 0 0 0\n"; print " outer loop\n"; - die unless @$t==3; - foreach my $p (@$t) { + die unless @$t==4; + foreach my $p (@$t[0..2]) { die unless @$p==3; print " vertex"; printf " %.18g", $_ foreach @$p;