4 use Math::Vector::Real;
15 my $slope_angle = 45 * TAU/360;
21 my $sine_angle = 1.20 * TAU/8;
23 my $ballend_xr = $thick/2;
27 my @i_sections = qw(ball0 -6
37 my @j_sections = qw(lin0 2
48 my ($ip,$it, $jp,$jt) = @_;
53 ($ip =~ m/0$/ ? -1 : +1),
58 my $i_thickscale = 1.0;
59 my $sine_len = $sine_size * sin($sine_angle);
60 my $sine_height = $sine_size * (1 - cos($sine_angle));
62 if ($ip =~ m/^lin[01]$/) {
63 $i_offset = V( -$lin_len * $it,
66 } elsif ($ip =~ m/^circle$/) {
67 $i_offset = V( 0,0,0 );
68 $i_outward = V( sin($it * TAU/2),
71 } elsif ($ip =~ m/^sine[01]$/) {
72 my $angle = $it * $sine_angle;
73 $i_offset = V( -$lin_len -$sine_size * sin($angle),
75 +$sine_size * (1 - cos($angle))
77 $i_j_y_angle = $angle;
78 } elsif ($ip =~ m/^ball[02]$/) {
79 $i_j_y_angle = $sine_angle;
80 my $angle = $it * TAU/4;
81 my $dx = sin($angle) * $ballend_xr;
82 $i_offset = V( -$lin_len -$sine_len - $dx * cos($sine_angle),
84 +$sine_height + $dx * sin($sine_angle)
86 $i_thickscale = cos($angle);
91 my $i_j_y_vect = V( sin($i_j_y_angle),
95 my $j_plus_th = $jp =~ m/2$/ ? $thick : 0;
97 my $i_thick = $thick * $i_thickscale;
98 my $j_p_x = $small_dia/2 + $thick/2;
99 my $j_rs_x = $large_dia/2 + $thick/2;
100 my $j_dqr_x = (1-cos($slope_angle)) * $jcurverad;
101 my $j_q_x = $j_rs_x - $j_dqr_x;
102 my $j_dpq = ($j_q_x - $j_p_x) / asin($slope_angle);
103 #print STDERR "($j_q_x - $j_p_x) / asin($slope_angle); => $j_dpq\n";
105 my $j_q_y = $j_p_y + $j_dpq * cos($slope_angle);
106 my $j_r_y = $j_q_y + sin($slope_angle) * $jcurverad;
108 my $j_qrc_x = $j_rs_x - $jcurverad;
109 my $j_qrc_y = $j_r_y;
114 if ($jp =~ m/^curveE$/) {
115 my $angle = ($jt + 1) * TAU/2 - $slope_angle;
116 $j_x = $j_p_x + $i_thick/2 * cos($angle);
117 $j_y = $j_p_y + $i_thick/2 * sin($angle);
118 } elsif ($jp =~ m/^curve[12]$/) {
119 my $angle = $slope_angle * $jt;
120 my $outwards = $jp =~ m/1/ ? -1 : +1;
121 $j_x = $j_qrc_x + cos($angle) * ($jcurverad + $outwards * $i_thick/2);
122 $j_y = $j_qrc_y - sin($angle) * ($jcurverad + $outwards * $i_thick/2);
123 } elsif ($jp =~ m/^lin0$/) {
124 $j_x = $j_rs_x + $i_thick * (+0.5 - $jt);
134 $i_j_y_vect = V(0,0,1);
137 # print STDERR "@_ $j_x $j_y $i_offset $i_outward\n";
142 V(0,0,1) * $j_qrc_y +
146 sub get_sections_ptvals {
149 while (my $name = shift @_) {
151 push @out, $last_ptval;
153 my $count = shift @_;
154 my $neg = sub { $_[0] };
157 $neg = sub { 1- $_[0] };
159 foreach (my $ix = 0; $ix < $count; $ix++) {
160 push @out, [ $name, $neg->($ix/$count) ];
162 $last_ptval = [ $name, $neg->(1.0) ];
180 foreach my $pval (@_) {
181 my $pix = $point_indices{$pval}
182 //= ((push @points, $pval), $#points);
183 if (grep { $pix eq $_ } @pixs) {
184 print "// elide @{ $ipts[$qi] } @{ $jpts[$qj] }\n";
189 push @triangles, [ $qi,$qj, \@pixs ];
193 @ipts = get_sections_ptvals(@i_sections);
194 @jpts = get_sections_ptvals(@j_sections);
196 foreach my $ipt (@ipts) {
198 foreach my $jpt (@jpts) {
199 push @row, &point(@$ipt, @$jpt);
203 foreach ($qi=0; $qi<$#ipts; $qi++) { # i direction does not wrap
205 foreach ($qj=0; $qj<@jpts; $qj++) { # j direction does wrap
206 my $qj2 = ($qj+1) % @jpts;
207 my $p0 = $sheet[$qi][$qj];
208 triangle($p0, $sheet[$qi2][$qj], $sheet[$qi2][$qj2]);
209 triangle($p0, $sheet[$qi2][$qj2], $sheet[$qi][$qj2]);
216 return "[".(join ',', @$v)."]";
220 print "module ImplHeadCup(){ polyhedron(points=[\n" or die $!;
221 print pv($_),",\n" or die $! foreach @points;
222 print "],faces=[\n" or die $!;
223 foreach (@triangles) {
224 print pv($_->[2]),", // @{ $ipts[$_->[0]] } @{ $jpts[$_->[1]] }\n" or die $!;
226 print "],convexity=10); }\n" or die $!;
227 print <<END or die $!;
228 implheadcup_large_dia = $large_dia;
229 implheadcup_thick = $thick;