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
-
);
-
curve1 10
-
- curveE 5
+ curveE 20
-
- curve2 10
+ curve2 -10
-
);
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$/) {
-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 ?";
}
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);
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 ?";
}
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;
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]);
}
}
}
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 $!;
}