X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=distort-stl;h=cc03ec5e7aea0776a516e12f900159adbdb2fb6f;hb=6db9e531dbae0b0a6d381509788b1f386dcef0bc;hp=9dab4ed8a0cf388034607558acd2f1373f5abc97;hpb=230c2e260ddf89a920b070ee48832199b18e212a;p=reprap-play.git diff --git a/distort-stl b/distort-stl index 9dab4ed..cc03ec5 100755 --- a/distort-stl +++ b/distort-stl @@ -34,7 +34,8 @@ sub TAU () { M_PI * 2; } our $fa = 10; -our @triangles; +our $triangles; +our $output; sub shift_arg () { die unless @ARGV; @@ -66,27 +67,43 @@ sub subdivide_triangle ($$) { $fn->(\@mids); } +sub append_triangle ($) { + my ($t) = @_; + push @$output, $t; +} + #---------- project-cylinder ---------- our $project_cylinder_radius; our $project_cylinder_max_d_theta; -sub project_cylinder_tri { +sub project_cylinder_triangle_need_subdivide ($) { my ($t) = @_; - - #print STDERR 'PROJECT', Dumper($t); - - my $radius = $project_cylinder_radius; - - my @thetas = map { $_->[0] / $radius } @$t; + my @thetas = map { $_->[0] / $project_cylinder_radius } @$t; foreach my $ix (0..2) { if (abs($thetas[$ix] - $thetas[($ix+1)%3]) > $project_cylinder_max_d_theta) { - subdivide_triangle $t, \&project_cylinder_tri; - return; + return 1; } } + return 0; +} + +sub project_cylinder_need_subdivide () { + foreach my $t (@$triangles) { + next unless project_cylinder_triangle_need_subdivide $t; + return 1; + } + return 0; +} + +sub project_cylinder_tri { + my ($t) = @_; + + #print STDERR 'PROJECT', Dumper($t); + + my $radius = $project_cylinder_radius; my @ot; foreach my $p (@$t) { @@ -97,17 +114,26 @@ sub project_cylinder_tri { -$r * cos($theta), $z ]; } - push @triangles, \@ot; + append_triangle \@ot; } sub op__project_cylinder () { $project_cylinder_radius = shift_arg; $project_cylinder_max_d_theta = $fa * TAU/360; - my @input = (@triangles); - @triangles = (); + while (project_cylinder_need_subdivide()) { + $output = []; + foreach my $t (@$triangles) { + subdivide_triangle $t, \&append_triangle; + } + $triangles = $output; + } - project_cylinder_tri $_ foreach @input; + $output = []; + foreach my $t (@$triangles) { + project_cylinder_tri $t; + } + $triangles = $output; } #---------- main program ---------- @@ -156,7 +182,7 @@ while () { push @$triangle, \@xyz; } elsif (m/^endloop/) { die unless @$triangle == 3; - push @triangles, $triangle; + push @$triangles, $triangle; undef $triangle; } elsif (m/^(?:solid|facet\s+normal|endfacet|endsolid)\s/) { } else { @@ -177,7 +203,7 @@ select $otmp; print "solid distort-stl\n"; -foreach my $t (@triangles) { +foreach my $t (@$triangles) { print " facet normal 0 0 0\n"; print " outer loop\n"; die unless @$t==3;