X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=reprap-play.git;a=blobdiff_plain;f=distort-stl;h=a470ae39c68a34965ea9fd5f5a3c0e66ddcf6a71;hp=dd430c9e452663b9aafcabdd7dc0abc3dfaf5ae7;hb=c1500ad488993e64e90ddd5aeb58ce75d91a889e;hpb=45146328f74d660232d33b0867ae1f6cd700e034 diff --git a/distort-stl b/distort-stl index dd430c9..a470ae3 100755 --- a/distort-stl +++ b/distort-stl @@ -32,6 +32,12 @@ use Data::Dumper; sub TAU () { M_PI * 2; } +my $ps = $ENV{DISTORT_PS}; +if ($ps) { + open PS, "> $ps" or die $!; + print PS "%!\n"; +} + our $fa = 10; our $triangles; @@ -44,25 +50,72 @@ sub shift_arg () { #no warnings qw(recursion); +sub sprintf_triangle ($) { + my ($t) = @_; + + 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 / ". + "%11.6f,%11.6f,%11.6f %-40s ", + $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], + $t->[3]; +} + 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])) { + 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 - push @$changed, - [ $t[$ix], \@midp, $t[kx] ], - [ $t[$kx], \@midp, $t[jx] ]; + 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; + + printf STDERR "%s\n", sprintf_triangle $n; + return; } } push @$ok, $t; + printf STDERR "OK nok=%d nchanged=%d\n", + (scalar @$ok), (scalar @$changed); } sub maybe_subdivide ($) { @@ -121,7 +174,7 @@ sub op__project_cylinder () { $project_cylinder_radius = shift_arg; $project_cylinder_max_d_theta = $fa * TAU/360; - maybe_subdivide \&project_cylinder_triangle_need_subdivide; + maybe_subdivide \&project_cylinder_edge_need_subdivide; $output = []; foreach my $t (@$triangles) { @@ -176,6 +229,7 @@ while () { push @$triangle, \@xyz; } elsif (m/^endloop/) { die unless @$triangle == 3; + push @$triangle, $.; push @$triangles, $triangle; undef $triangle; } elsif (m/^(?:solid|facet\s+normal|endfacet|endsolid)\s/) {