chiark / gitweb /
lemon-stand.scad.pl: remove obsolete sub circles (nfc)
[reprap-play.git] / lemon-stand.scad.pl
1 #!/usr/bin/perl -w
2
3 use strict;
4 use Math::Trig;
5 use Math::Vector::Real;
6 use IO::File;
7 use Data::Dumper;
8 use constant tau => pi*2;
9
10 print <<END;
11 // -*- C -*-
12 // *** AUTOGENERATED - DO NOT EDIT ***
13 END
14
15 my $ellipse = 20;
16 my $circle = 6;
17 my $xscale = 2;
18 my $N = 30; # around ellipse
19 my $M = 20; # around each circle
20
21 our @ellipse = map {
22     my $theta = tau * $_ / $N;
23     V( cos($theta) * $ellipse * $xscale, sin($theta) * $ellipse, 0 )
24 } 0..($N-1);
25
26 #print Dumper(\@ellipse);
27
28 our @alongs = map {
29     my $i = $_;
30     $ellipse[ ($i+1) % $N ] - $ellipse[ ($i-1) % $N];
31 } 0..($N-1);
32
33 our @circles = map {
34     my $i = $_;
35     my $centre = $ellipse[$i];
36     my $axis = $alongs[$i]->versor();
37     my $rad0 = $axis x V(0,0,1);
38     my $rad1 = $rad0 x $axis;
39     [ map {
40         my $theta = tau * $_ / $M;
41         $centre + $circle * ($rad0 * cos($theta) + $rad1 * sin($theta));
42     } 0..($M-1) ];
43 } 0..($N-1);
44
45 sub torusy () {
46     print "module Torusy(){ polyhedron(points=[";
47     my $ptix = 0;
48     my @cirpt;
49     foreach my $i (0..$N-1) {
50         foreach my $j (0..$M-1) {
51             print "," if $ptix;
52             print "\n";
53             print "    [ ", (join ", ", @{ $circles[$i][$j] }), " ]";
54             $cirpt[$i][$j] = $ptix++;
55         }
56     }
57     print "\n  ],\n";
58
59     print "  faces=[";
60     foreach my $i (0..$N-1) {
61         my $i2 = ($i+1) % $N;
62         foreach my $j (0..$M-1) {
63             my $j2 = ($j+1) % $M;
64             print "," if $i || $j;
65             print "\n";
66             print "   [ ", (join ", ",
67                             $cirpt[ $i  ][ $j  ],
68                             $cirpt[ $i  ][ $j2 ],
69                             $cirpt[ $i2 ][ $j  ],
70                            ), " ],";
71             print "   [ ", (join ", ",
72                             $cirpt[ $i  ][ $j2 ],
73                             $cirpt[ $i2 ][ $j2 ],
74                             $cirpt[ $i2 ][ $j  ],
75                            ), " ]";
76         }
77     }
78     print "\n  ]);\n}\n";
79 }
80
81 torusy();
82
83 while (<DATA>) { print };
84
85 STDOUT->error and die $!;
86 STDOUT->flush or die $!;
87
88 __DATA__
89 Torusy();