From: Ian Jackson Date: Fri, 20 Oct 2017 17:23:54 +0000 (+0100) Subject: poster-tube-lid-parametric: wip, makes a file which has right syntax X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=0c1d7a9a1ff370853485a420f335cdad1c5f95f7;p=reprap-play.git poster-tube-lid-parametric: wip, makes a file which has right syntax --- diff --git a/poster-tube-lid-parametric.pl b/poster-tube-lid-parametric.pl index 2c14993..84d28f9 100755 --- a/poster-tube-lid-parametric.pl +++ b/poster-tube-lid-parametric.pl @@ -2,14 +2,17 @@ use strict; use Math::Vector::Real; +use Math::Trig qw(pi); +use POSIX; +use Data::Dumper; -sub TAU () { PI*2; } +sub TAU () { pi*2; } my $thick = 4; my $small_dia = 20; my $large_dia = 30; -my $slope_angle = 45; +my $slope_angle = 45 * TAU/360; my $jcurverad = 5; my $tall = 50; @@ -27,28 +30,30 @@ my @i_sections = qw(ball0 6 lin1 2 sine1 10 lin2 2 - ball2 6); + ball2 6 + - + ); my @j_sections = qw(lin0 2 - ! + - curve1 10 - | + - curveE 5 - | + - curve2 10 - | + - ); -sub point ($$) { +sub point ($$$$) { my ($ip,$it, $jp,$jt) = @_; my ($i_offset, $i_outward); $i_outward = V( 0, - ($ip =~ m/0$/ ? -1 : +1), - 0 ); + ($ip =~ m/0$/ ? -1 : +1), + 0 ); - $i_thickscale = 1.0; + my $i_thickscale = 1.0; if ($ip =~ m/^lin[01]$/) { $i_offset = V( $lin_len * ($ip =~ m/1/ ? $it : 1-$it), @@ -57,7 +62,7 @@ sub point ($$) { } elsif ($ip =~ m/^circle$/) { $i_offset = V( 0,0,0 ); $i_outward = V( sin($it * TAU/2), - -cos($ip * TAU/2), + -cos($it * TAU/2), 0 ); } elsif ($ip =~ m/^lin2$/) { $i_offset = V( -$lin_len -$sine_len + $it*$lin2_len, @@ -74,7 +79,7 @@ sub point ($$) { -($ip =~ m/2/ ? $lin2_len : 0) -sin($angle) * $ballend_xr, 0, - +$sine_height; + +$sine_height ); } else { die "$ip ?"; @@ -88,6 +93,7 @@ sub point ($$) { my $j_dqr_x = (1-cos($slope_angle)) * $jcurverad; my $j_q_x = $j_rs_x - $j_dqr_x; my $j_dpq = ($j_q_x - $j_p_x) / asin($slope_angle); + #print STDERR "($j_q_x - $j_p_x) / asin($slope_angle); => $j_dpq\n"; my $j_p_y = 0; my $j_q_y = $j_p_y + $j_dpq * cos($slope_angle); my $j_r_y = $j_q_y + sin($slope_angle) * $jcurverad; @@ -95,32 +101,37 @@ sub point ($$) { my $j_qrc_x = $j_rs_x - $jcurverad; my $j_qrc_y = $j_r_y; + my $j_x; + my $j_y; + if ($jp =~ m/^curveE$/) { my $angle = ($jt + 1) * TAU/2 - $slope_angle; $j_x = $j_p_x + $i_thick * cos($angle); $j_y = $j_p_y + $i_thick * sin($angle); - } elsif ($jp =~ m/^curve[12]E$/) { + } elsif ($jp =~ m/^curve[12]$/) { my $angle = $slope_angle * ($jp =~ m/1/ ? $jt : (1-$jt)); my $outwards = $jp =~ m/1/ ? -1 : +1; $j_x = $j_qrc_x + cos($angle) * ($jcurverad + $outwards * $i_thick); $j_y = $j_qrc_y + sin($angle) * ($jcurverad + $outwards * $i_thick); } elsif ($jp =~ m/^lin0$/) { - $j_x = $j_rs_x + $i_thick * (-0.5 + 0.5 * jt); + $j_x = $j_rs_x + $i_thick * (-0.5 + 0.5 * $jt); $j_y = $j_s_y; } else { die "$jp ?"; } + +# print STDERR "@_ $j_x $j_y $i_offset $i_outward\n"; return $i_offset + - $i_outward * $j_x + - [0,0,1] * $j_y; + $j_x * $i_outward + + V(0,0,1) * $j_y; } sub get_sections_ptvals { my $last_name; my @out; - while (defined my $name = shift @_) { - if ($name eq '|') { + while (my $name = shift @_) { + if ($name eq '-') { push @out, [ $last_name, 1.0 ]; } else { my $count = shift @_; @@ -130,6 +141,7 @@ sub get_sections_ptvals { $last_name = $name; } } + return @out; } our @points; @@ -141,7 +153,7 @@ sub triangle { foreach my $pval (@_) { my $pix = $point_indices{$pval} //= ((push @points, $pval), $#points); - return if grep { $pix eq $_ } @pixs + return if grep { $pix eq $_ } @pixs; push @pixs, $pix; } push @triangles, \@pixs; @@ -154,7 +166,7 @@ sub make_sheet () { foreach my $ipt (@ipts) { my @row = (); foreach my $jpt (@jpts) { - push @row, &point @$ipt, @$jpt; + push @row, &point(@$ipt, @$jpt); } push @sheet, \@row; } @@ -169,12 +181,17 @@ sub make_sheet () { } } -sub write_out ($) { +sub pv ($) { + my $v = shift @_; + return "[".(join ',', @$v)."]"; +} + +sub write_out () { print "polyhedron(points=[\n" or die $!; - print $_,",\n" or die $! foreach @points; + print pv($_),",\n" or die $! foreach @points; print "],triangles=[\n" or die $!; - print $_,",\n" or die $! foreach @triangles; - print "],convexity=10)\n" or die $!; + print pv($_),",\n" or die $! foreach @triangles; + print "],convexity=10);\n" or die $!; } make_sheet();