sub TAU () { pi*2; }
-my $thick = 4;
+my $thick = 2.5;
my $small_dia = 20;
my $large_dia = 30;
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
-
);
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,
$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;
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) ;
}
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 = ();
}
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]);
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();