chiark / gitweb /
lemon-stand.scad.pl: wip
[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 circle ($$$) { my ($c,$i,$j) = @_; $c->[ $i % $N ][ $j % $M ]; }
46
47 sub torusy () {
48     print "module Torusy(){ polyhedron(points=[";
49     my $ptix = 0;
50     my @cirpt;
51     foreach my $i (0..$N-1) {
52         foreach my $j (0..$M-1) {
53             print "," if $ptix;
54             print "\n";
55             print "    [ ", (join ", ", @{ $circles[$i][$j] }), " ]";
56             $cirpt[$i][$j] = $ptix++;
57         }
58     }
59     print "\n  ],\n";
60
61     print "  faces=[";
62     foreach my $i (0..$N-1) {
63         my $i2 = ($i+1) % $N;
64         foreach my $j (0..$M-1) {
65             my $j2 = ($j+1) % $M;
66             print "," if $i || $j;
67             print "\n";
68             print "   [ ", (join ", ",
69                             $cirpt[ $i  ][ $j  ],
70                             $cirpt[ $i  ][ $j2 ],
71                             $cirpt[ $i2 ][ $j  ],
72                            ), " ],";
73             print "   [ ", (join ", ",
74                             $cirpt[ $i  ][ $j2 ],
75                             $cirpt[ $i2 ][ $j2 ],
76                             $cirpt[ $i2 ][ $j  ],
77                            ), " ]";
78         }
79     }
80     print "\n  ]);\n}\n";
81 }
82
83 torusy();
84
85 while (<DATA>) { print };
86
87 STDOUT->error and die $!;
88 STDOUT->flush or die $!;
89
90 __DATA__
91 Torusy();