5 use Math::Vector::Real;
8 use constant tau => pi*2;
12 my $xscale = 33 / 100;
13 my $N = 180; # around ellipse
14 my $M = 80; # around each circle
16 my $NMdiv = $ENV{'ELECTRONTOKEN_COARSE'} || 1;
23 // *** AUTOGENERATED - DO NOT EDIT ***
26 print "torusyup = ", ($circle / sqrt(2)), ";\n";
29 my $theta = tau * $_ / $N;
30 V( cos($theta) * $ellipse * $xscale, sin($theta) * $ellipse, 0 )
33 #print Dumper(\@ellipse);
37 $ellipse[ ($i+1) % $N ] - $ellipse[ ($i-1) % $N];
42 my $centre = $ellipse[$i];
43 my $axis = $alongs[$i]->versor();
44 my $rad0 = $axis x V(0,0,1);
45 my $rad1 = $rad0 x $axis;
47 my $theta = tau * $_ / $M;
48 $centre + $circle * ($rad0 * cos($theta) + $rad1 * sin($theta));
54 return "[ ".(join ", ", @$v)." ]"
58 print "module Torusy(){ polyhedron(points=[";
61 foreach my $i (0..$N-1) {
62 foreach my $j (0..$M-1) {
65 print " ",(scadvec $circles[$i][$j]);
66 $cirpt[$i][$j] = $ptix++;
72 foreach my $i (0..$N-1) {
74 foreach my $j (0..$M-1) {
76 print "," if $i || $j;
78 print " [ ", (join ", ",
83 print " [ ", (join ", ",
98 foreach my $i (1..$N) {
99 my $dist = $distances[ $i-1 ];
100 $dist += abs($ellipse[$i % $N] - $ellipse[$i-1]);
101 $distances[$i] = $dist;
104 sub infodistprop ($) {
107 # ( $ellipse_centreline_point,
109 my $dist = $distprop * $distances[$N];
110 foreach my $i (0..$N-1) {
112 ($dist - $distances[$i]) /
113 ($distances[$i+1] - $distances[$i]);
114 next unless 0 <= $prorata && $prorata <= 1;
115 print "// infodistprop $distprop => #$i=$ellipse[$i] $prorata $ellipse[$i+1]\n";
117 (1-$prorata) * $ellipse[$i] + ($prorata) * $ellipse[$i+1],
124 while (<DATA>) { print };
126 STDOUT->error and die $!;
127 STDOUT->flush or die $!;
132 for (rot=[ 0,120,240 ])
134 translate([0,0,torusyup])
136 translate([-200,-200,-50])