chiark / gitweb /
poster-tube-lid-parametric: fix diameter
[reprap-play.git] / poster-tube-lid-parametric.pl
index 84d28f9ed9accb90953fbcc97f29d870a10e6a52..fc10667b2b4cea563cfc95697cccadfa40f0bb3c 100755 (executable)
@@ -23,13 +23,15 @@ my $sine_height = 6;
 
 my $ballend_xr = $thick/2;
 
-my @i_sections = qw(ball0   6
-                   sine0  10
+my @i_sections = qw(ball0  -6
+                   sine0  -10
+                   -
                    lin0    2
                    circle 20
                    lin1    2
                    sine1  10
-                   lin2    2
+                   -
+                   lin2   -2
                    ball2   6
                    -
                    );
@@ -38,9 +40,9 @@ my @j_sections = qw(lin0    2
                    -
                    curve1 10
                    -
-                   curveE 5
+                   curveE 20
                    -
-                   curve2 10
+                   curve2 -10
                    -
                    );
 
@@ -56,7 +58,7 @@ sub point ($$$$) {
     my $i_thickscale = 1.0;
 
     if ($ip =~ m/^lin[01]$/) {
-       $i_offset = V( $lin_len * ($ip =~ m/1/ ? $it : 1-$it),
+       $i_offset = V( -$lin_len * $it,
                       0,
                       0 );
     } elsif ($ip =~ m/^circle$/) {
@@ -65,22 +67,23 @@ sub point ($$$$) {
                         -cos($it * TAU/2),
                         0 );
     } elsif ($ip =~ m/^lin2$/) {
-       $i_offset = V( -$lin_len -$sine_len + $it*$lin2_len,
+       $i_offset = V( -$lin_len -$sine_len - $it*$lin2_len,
                       0,
-                      +1 );
+                      +$sine_height );
     } elsif ($ip =~ m/^sine[01]$/) {
        $i_offset = V( -$lin_len -$it*$sine_len,
                       0,
                       $sine_height * ( 0.5 - 0.5*cos( $it*TAU/2 ) )
                     );
     } elsif ($ip =~ m/^ball[02]$/) {
-       my $angle = ($ip =~ m/0/ ? (1-$it) : $it) * TAU/4;
+       my $angle = $it * TAU/4;
        $i_offset = V( -$lin_len -$sine_len
                       -($ip =~ m/2/ ? $lin2_len : 0)
                       -sin($angle) * $ballend_xr,
                       0,
                       +$sine_height
                     );
+       $i_thickscale = cos($angle);
     } else {
        die "$ip ?";
     }
@@ -88,8 +91,8 @@ sub point ($$$$) {
     my $j_plus_th = $jp =~ m/2$/ ? $thick : 0;
 
     my $i_thick = $thick * $i_thickscale;
-    my $j_p_x = $small_dia/2 + $thick;
-    my $j_rs_x = $large_dia/2 + $thick;
+    my $j_p_x = $small_dia/2 + $thick/2;
+    my $j_rs_x = $large_dia/2 + $thick/2;
     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);
@@ -106,16 +109,17 @@ sub point ($$$$) {
 
     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);
+       $j_x = $j_p_x + $i_thick/2 * cos($angle);
+       $j_y = $j_p_y + $i_thick/2 * sin($angle);
     } elsif ($jp =~ m/^curve[12]$/) {
-       my $angle = $slope_angle * ($jp =~ m/1/ ? $jt : (1-$jt));
+       my $angle = $slope_angle * $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);
+       $j_x = $j_qrc_x + cos($angle) * ($jcurverad + $outwards * $i_thick/2);
+       $j_y = $j_qrc_y - sin($angle) * ($jcurverad + $outwards * $i_thick/2);
     } 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 - $jt);
        $j_y = $j_s_y;
+       $i_offset->[2] = 0;
     } else {
        die "$jp ?";
     }
@@ -124,21 +128,27 @@ sub point ($$$$) {
     return
        $i_offset +
        $j_x * $i_outward +
-       V(0,0,1) * $j_y;
+       V(0,0,1) * $j_y +
+       V(0,0,-$tall) ;
 }
 
 sub get_sections_ptvals {
-    my $last_name;
+    my $last_ptval;
     my @out;
     while (my $name = shift @_) {
        if ($name eq '-') {
-           push @out, [ $last_name, 1.0 ];
+           push @out, $last_ptval;
        } else {
            my $count = shift @_;
+           my $neg = sub { $_[0] };
+           if ($count < 0) {
+               $count = -$count;
+               $neg = sub { 1- $_[0] };
+           }
            foreach (my $ix = 0; $ix < $count; $ix++) {
-               push @out, [ $name, $ix/$count ];
+               push @out, [ $name, $neg->($ix/$count) ];
            }
-           $last_name = $name;
+           $last_ptval = [ $name, $neg->(1.0) ];
        }
     }
     return @out;
@@ -176,7 +186,7 @@ sub make_sheet () {
            my $qj2 = ($qj+1) % @jpts;
            my $p0 = $sheet[$qi][$qj];
            triangle($p0, $sheet[$qi2][$qj], $sheet[$qi2][$qj2]);
-           triangle($p0, $sheet[$qi2][$qj2], $sheet[$qi2][$qj2]);
+           triangle($p0, $sheet[$qi2][$qj2], $sheet[$qi][$qj2]);
        }
     }
 }
@@ -189,7 +199,7 @@ sub pv ($) {
 sub write_out () {
     print "polyhedron(points=[\n" or die $!;
     print pv($_),",\n" or die $! foreach @points;
-    print "],triangles=[\n" or die $!;
+    print "],faces=[\n" or die $!;
     print pv($_),",\n" or die $! foreach @triangles;
     print "],convexity=10);\n" or die $!;
 }