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;
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),
} 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,
-($ip =~ m/2/ ? $lin2_len : 0)
-sin($angle) * $ballend_xr,
0,
- +$sine_height;
+ +$sine_height
);
} else {
die "$ip ?";
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;
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 @_;
$last_name = $name;
}
}
+ return @out;
}
our @points;
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;
foreach my $ipt (@ipts) {
my @row = ();
foreach my $jpt (@jpts) {
- push @row, &point @$ipt, @$jpt;
+ push @row, &point(@$ipt, @$jpt);
}
push @sheet, \@row;
}
}
}
-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();