chiark / gitweb /
poster-tube-lid-parametric: wip, makes a file which has right syntax
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 20 Oct 2017 17:23:54 +0000 (18:23 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 20 Oct 2017 17:24:17 +0000 (18:24 +0100)
poster-tube-lid-parametric.pl

index 2c14993919a603108c91e4014b4caa8335ef6bf9..84d28f9ed9accb90953fbcc97f29d870a10e6a52 100755 (executable)
@@ -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();