chiark / gitweb /
ksafe-base: wip
[reprap-play.git] / poster-tube-lid-parametric.scad.pl
index 353c7123c6007b0645210c92b1f5d13446046318..64d4d00ebe9f5b472789f5411155e6457b95d8ec 100755 (executable)
@@ -8,7 +8,7 @@ use Data::Dumper;
 
 sub TAU () { pi*2; }
 
-my $thick = 4;
+my $thick = 2.5;
 
 my $small_dia = 20;
 my $large_dia = 30;
@@ -16,22 +16,20 @@ my $slope_angle = 45 * TAU/360;
 my $jcurverad = 5;
 my $tall = 50;
 
-my $lin_len = 10;
-my $lin2_len = 9;
-my $sine_len = 8;
-my $sine_height = 6;
+my $lin_len = 2;
+my $sine_size = 5;
+my $sine_angle = 1.20 * TAU/8;
 
 my $ballend_xr = $thick/2;
 
+my $skew_slope = 0.7;
+
 my @i_sections = qw(ball0  -6
                    sine0  -10
-                   -
-                   lin0    2
-                   circle 20
+                   lin0    -2
+                   circle 40
                    lin1    2
                    sine1  10
-                   -
-                   lin2   -2
                    ball2   6
                    -
                    );
@@ -49,13 +47,17 @@ my @j_sections = qw(lin0    2
 sub point ($$$$) {
     my ($ip,$it, $jp,$jt) = @_;
 
-    my ($i_offset, $i_outward);
+    my ($i_offset);
 
-    $i_outward = V( 0,
-                   ($ip =~ m/0$/ ? -1 : +1),
-                   0 );
+    my $i_outward = V( 0,
+                      ($ip =~ m/0$/ ? -1 : +1),
+                      0 );
+
+    my $i_j_y_angle = 0;
 
     my $i_thickscale = 1.0;
+    my $sine_len = $sine_size * sin($sine_angle);
+    my $sine_height = $sine_size * (1 - cos($sine_angle));
 
     if ($ip =~ m/^lin[01]$/) {
        $i_offset = V( -$lin_len * $it,
@@ -66,28 +68,30 @@ sub point ($$$$) {
        $i_outward = V(  sin($it * TAU/2),
                         -cos($it * TAU/2),
                         0 );
-    } elsif ($ip =~ m/^lin2$/) {
-       $i_offset = V( -$lin_len -$sine_len - $it*$lin2_len,
-                      0,
-                      +$sine_height );
     } elsif ($ip =~ m/^sine[01]$/) {
-       $i_offset = V( -$lin_len -$it*$sine_len,
+       my $angle = $it * $sine_angle;
+       $i_offset = V( -$lin_len -$sine_size * sin($angle),
                       0,
-                      $sine_height * ( 0.5 - 0.5*cos( $it*TAU/2 ) )
+                      +$sine_size * (1 - cos($angle))
                     );
+       $i_j_y_angle = $angle;
     } elsif ($ip =~ m/^ball[02]$/) {
+       $i_j_y_angle = $sine_angle;
        my $angle = $it * TAU/4;
-       $i_offset = V( -$lin_len -$sine_len
-                      -($ip =~ m/2/ ? $lin2_len : 0)
-                      -sin($angle) * $ballend_xr,
+       my $dx = sin($angle) * $ballend_xr;
+       $i_offset = V( -$lin_len -$sine_len - $dx * cos($sine_angle),
                       0,
-                      +$sine_height
+                      +$sine_height + $dx * sin($sine_angle)
                     );
        $i_thickscale = cos($angle);
     } else {
        die "$ip ?";
     }
 
+    my $i_j_y_vect = V( sin($i_j_y_angle),
+                       0,
+                       cos($i_j_y_angle ));
+
     my $j_plus_th = $jp =~ m/2$/ ? $thick : 0;
 
     my $i_thick = $thick * $i_thickscale;
@@ -124,11 +128,18 @@ sub point ($$$$) {
        die "$jp ?";
     }
 
+    $j_y -= $j_qrc_y;
+
+    if ($j_y > 0) {
+       $i_j_y_vect = V(0,0,1);
+    }
+
 #    print STDERR "@_ $j_x $j_y $i_offset $i_outward\n";
     return
        $i_offset +
        $j_x * $i_outward +
-       V(0,0,1) * $j_y +
+       $i_j_y_vect * $j_y +
+       V(0,0,1) * $j_qrc_y +
        V(0,0,-$tall) ;
 }
 
@@ -158,20 +169,29 @@ our @points;
 our %point_indices;
 our @triangles;
 
+my @ipts;
+my @jpts;
+
+my $qi;
+my $qj;
+
 sub triangle {
     my @pixs;
     foreach my $pval (@_) {
        my $pix = $point_indices{$pval}
            //= ((push @points, $pval), $#points);
-       return if grep { $pix eq $_ } @pixs;
+       if (grep { $pix eq $_ } @pixs) {
+           print "// elide @{ $ipts[$qi] } @{ $jpts[$qj] }\n";
+           return;
+       }
        push @pixs, $pix;
     }
-    push @triangles, \@pixs;
+    push @triangles, [ $qi,$qj, \@pixs ];
 }
 
 sub make_sheet () {
-    my @ipts = get_sections_ptvals(@i_sections);
-    my @jpts = get_sections_ptvals(@j_sections);
+    @ipts = get_sections_ptvals(@i_sections);
+    @jpts = get_sections_ptvals(@j_sections);
     my @sheet;
     foreach my $ipt (@ipts) {
        my @row = ();
@@ -180,9 +200,9 @@ sub make_sheet () {
        }
        push @sheet, \@row;
     }
-    foreach (my $qi=0; $qi<$#ipts; $qi++) { # i direction does not wrap
+    foreach ($qi=0; $qi<$#ipts; $qi++) { # i direction does not wrap
        my $qi2 = $qi+1;
-       foreach (my $qj=0; $qj<@jpts; $qj++) { # j direction does wrap
+       foreach ($qj=0; $qj<@jpts; $qj++) { # j direction does wrap
            my $qj2 = ($qj+1) % @jpts;
            my $p0 = $sheet[$qi][$qj];
            triangle($p0, $sheet[$qi2][$qj], $sheet[$qi2][$qj2]);
@@ -200,8 +220,14 @@ sub write_out () {
     print "module ImplHeadCup(){ polyhedron(points=[\n" or die $!;
     print pv($_),",\n" or die $! foreach @points;
     print "],faces=[\n" or die $!;
-    print pv($_),",\n" or die $! foreach @triangles;
+    foreach (@triangles) {
+       print pv($_->[2]),", // @{ $ipts[$_->[0]] } @{ $jpts[$_->[1]] }\n" or die $!;
+    }
     print "],convexity=10); }\n" or die $!;
+    print <<END or die $!;
+implheadcup_large_dia = $large_dia;
+implheadcup_thick     = $thick;
+END
 }
 
 make_sheet();