| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
# Math::Polyhedra - locate vertices, edges, and faces of common polyhedra |
|
2
|
|
|
|
|
|
|
|
|
3
|
|
|
|
|
|
|
package Math::Polyhedra; |
|
4
|
|
|
|
|
|
|
|
|
5
|
|
|
|
|
|
|
#---------------------------------------------------------------------------- |
|
6
|
|
|
|
|
|
|
# |
|
7
|
|
|
|
|
|
|
# Copyright (C) 1998-2003 Ed Halley |
|
8
|
|
|
|
|
|
|
# http://www.halley.cc/ed/ |
|
9
|
|
|
|
|
|
|
# |
|
10
|
|
|
|
|
|
|
# Data Copyright (C) Robert W. Gray, Used with Permission. |
|
11
|
|
|
|
|
|
|
# http://www.rwgrayprojects.com/Lynn/Coordinates/coord01.html |
|
12
|
|
|
|
|
|
|
# |
|
13
|
|
|
|
|
|
|
#---------------------------------------------------------------------------- |
|
14
|
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
BEGIN |
|
16
|
|
|
|
|
|
|
{ |
|
17
|
1
|
|
|
1
|
|
32183
|
use vars qw($VERSION @ISA); |
|
|
1
|
|
|
|
|
3
|
|
|
|
1
|
|
|
|
|
105
|
|
|
18
|
1
|
|
|
1
|
|
2
|
$VERSION = 0.7; |
|
19
|
1
|
|
|
|
|
18
|
@ISA = qw(Exporter); |
|
20
|
1
|
|
|
|
|
5643
|
@EXPORT_OK = qw(phi coordinates polyhedron polyhedra |
|
21
|
|
|
|
|
|
|
vertices edges faces tris); |
|
22
|
|
|
|
|
|
|
} |
|
23
|
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
=head1 NAME |
|
25
|
|
|
|
|
|
|
|
|
26
|
|
|
|
|
|
|
Math::Polyhedra - locate vertices, edges, and faces of common polyhedra |
|
27
|
|
|
|
|
|
|
|
|
28
|
|
|
|
|
|
|
=head1 SYNOPSIS |
|
29
|
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
use Math::Polyhedra qw(polyhedron vertices edges faces tris); |
|
31
|
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
my $hedron = polyhedron('rhombic dodecahedron'); |
|
33
|
|
|
|
|
|
|
my $vertices = vertices($hedron); |
|
34
|
|
|
|
|
|
|
my $edges = edges($hedron); |
|
35
|
|
|
|
|
|
|
my $faces = faces($hedron); |
|
36
|
|
|
|
|
|
|
my $tris = tris($hedron); |
|
37
|
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
=head1 ABSTRACT |
|
39
|
|
|
|
|
|
|
|
|
40
|
|
|
|
|
|
|
This module calculates and structures the coordinates of a library of |
|
41
|
|
|
|
|
|
|
commonly useful regular polyhedra. These geometrical figures can be |
|
42
|
|
|
|
|
|
|
selected by name, or by the number of sides. |
|
43
|
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
The heart of the data is a set of 62 coordinates, from which each of |
|
45
|
|
|
|
|
|
|
these common polyhedra can be defined. Each of the vertices can be |
|
46
|
|
|
|
|
|
|
defined as a set of points around the origin measured with various |
|
47
|
|
|
|
|
|
|
multiples and powers of I, also known as the S, which |
|
48
|
|
|
|
|
|
|
is approximately 1.618. |
|
49
|
|
|
|
|
|
|
|
|
50
|
|
|
|
|
|
|
This package was inspired by the nice reference page provided by Robert |
|
51
|
|
|
|
|
|
|
W. Gray: L. |
|
52
|
|
|
|
|
|
|
Other sites also explore the S and these polyhedra. |
|
53
|
|
|
|
|
|
|
|
|
54
|
|
|
|
|
|
|
=cut |
|
55
|
|
|
|
|
|
|
|
|
56
|
|
|
|
|
|
|
#---------------------------------------------------------------------------- |
|
57
|
|
|
|
|
|
|
|
|
58
|
|
|
|
|
|
|
=head1 FUNCTIONS |
|
59
|
|
|
|
|
|
|
|
|
60
|
|
|
|
|
|
|
=head2 phi() |
|
61
|
|
|
|
|
|
|
|
|
62
|
|
|
|
|
|
|
The C is usually referred by the greek letter I. This |
|
63
|
|
|
|
|
|
|
can be defined by the following expression: |
|
64
|
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
____ |
|
66
|
|
|
|
|
|
|
1 + \/ 5 |
|
67
|
|
|
|
|
|
|
phi = ------------ = (1 + sqrt(5)) / 2 |
|
68
|
|
|
|
|
|
|
2 |
|
69
|
|
|
|
|
|
|
|
|
70
|
|
|
|
|
|
|
This function simply returns that numeric value, which comes close to |
|
71
|
|
|
|
|
|
|
1.61803398874989. This number, like I, has many interesting |
|
72
|
|
|
|
|
|
|
properties and appears both in nature and invention. |
|
73
|
|
|
|
|
|
|
|
|
74
|
|
|
|
|
|
|
=cut |
|
75
|
|
|
|
|
|
|
|
|
76
|
|
|
|
|
|
|
my $F = undef; |
|
77
|
|
|
|
|
|
|
sub phi |
|
78
|
|
|
|
|
|
|
{ |
|
79
|
2
|
100
|
|
2
|
1
|
13
|
return $F if $F; |
|
80
|
1
|
|
|
|
|
3
|
$F = (1 + sqrt(5)) / 2; |
|
81
|
1
|
|
|
|
|
10
|
return $F; |
|
82
|
|
|
|
|
|
|
} |
|
83
|
|
|
|
|
|
|
|
|
84
|
|
|
|
|
|
|
=head2 coordinates() |
|
85
|
|
|
|
|
|
|
|
|
86
|
|
|
|
|
|
|
Returns a list reference containing the master set of coordinate vectors. |
|
87
|
|
|
|
|
|
|
All or most of these coordinates are calculated from the value of I. |
|
88
|
|
|
|
|
|
|
|
|
89
|
|
|
|
|
|
|
Without arguments, the points are only allocated and calculated on the |
|
90
|
|
|
|
|
|
|
first call to this function. Subsequent calls without arguments will |
|
91
|
|
|
|
|
|
|
return the same list reference each time. Each vector is a simple |
|
92
|
|
|
|
|
|
|
unblessed list reference, like C<[ $x, $y, $z ]>. |
|
93
|
|
|
|
|
|
|
|
|
94
|
|
|
|
|
|
|
With any argument, this function will calculate a new list afresh. This |
|
95
|
|
|
|
|
|
|
takes slightly more memory and time, but some algorithms may want to |
|
96
|
|
|
|
|
|
|
change the given coordinates, which would otherwise spoil future calls |
|
97
|
|
|
|
|
|
|
that would return the modified list. |
|
98
|
|
|
|
|
|
|
|
|
99
|
|
|
|
|
|
|
If the first argument given is a code reference, then that code is called |
|
100
|
|
|
|
|
|
|
once per vector, with the vector as an argument. The result of that code |
|
101
|
|
|
|
|
|
|
then B the original vector in the master set used by the other |
|
102
|
|
|
|
|
|
|
functions. This can be used to bless or convert the vectors with other |
|
103
|
|
|
|
|
|
|
vector math packages: |
|
104
|
|
|
|
|
|
|
|
|
105
|
|
|
|
|
|
|
use Math::Polyhedra; |
|
106
|
|
|
|
|
|
|
use Math::VectorReal; |
|
107
|
|
|
|
|
|
|
my $coords = coordinates( sub { vector(@{$_[0]}) } ); |
|
108
|
|
|
|
|
|
|
|
|
109
|
|
|
|
|
|
|
After the above code, all vectors returned by any function in this module |
|
110
|
|
|
|
|
|
|
are then referring to blessed C object instances. Just |
|
111
|
|
|
|
|
|
|
about any vector library would work similarly. The choice of which |
|
112
|
|
|
|
|
|
|
vector module to use is arbitrary, since it's the given code reference |
|
113
|
|
|
|
|
|
|
which drives the vector conversion. |
|
114
|
|
|
|
|
|
|
|
|
115
|
|
|
|
|
|
|
=cut |
|
116
|
|
|
|
|
|
|
|
|
117
|
|
|
|
|
|
|
my $Coords = undef; |
|
118
|
|
|
|
|
|
|
sub coordinates |
|
119
|
|
|
|
|
|
|
{ |
|
120
|
|
|
|
|
|
|
# We pass through any blessed reference to our own package; no-op. |
|
121
|
|
|
|
|
|
|
# This allows callers to pass specific coord sets through the other |
|
122
|
|
|
|
|
|
|
# functions in this module; an undocumented feature which may change. |
|
123
|
|
|
|
|
|
|
# Any passed-through set is not memo-ized. |
|
124
|
32
|
50
|
|
32
|
1
|
147
|
return $_[0] if UNIVERSAL::isa($_[0], __PACKAGE__); |
|
125
|
|
|
|
|
|
|
|
|
126
|
|
|
|
|
|
|
# If any argument is given, it revokes previous memo-ized results and |
|
127
|
|
|
|
|
|
|
# we need to make a fresh set of vectors instead. We'll check what |
|
128
|
|
|
|
|
|
|
# the argument type is, if any, later. If no argument, we may use |
|
129
|
|
|
|
|
|
|
# any already memo-ized prepared set. |
|
130
|
32
|
50
|
|
|
|
81
|
$Coords = undef if @_; |
|
131
|
32
|
100
|
|
|
|
86
|
return $Coords if $Coords; |
|
132
|
|
|
|
|
|
|
|
|
133
|
|
|
|
|
|
|
# The Golden Ratio, often written as phi or F. |
|
134
|
|
|
|
|
|
|
# The value of F is approximately 1.61803398874989. |
|
135
|
|
|
|
|
|
|
# All of the polyhedra coordinates in X, Y and Z are some relation to F. |
|
136
|
1
|
|
|
|
|
4
|
my $F = phi(); |
|
137
|
1
|
|
|
|
|
138
|
$Coords = |
|
138
|
|
|
|
|
|
|
# X Y Z |
|
139
|
|
|
|
|
|
|
[ undef, |
|
140
|
|
|
|
|
|
|
[ 0, 0, 2*$F**2 ], |
|
141
|
|
|
|
|
|
|
[ $F**2, 0, $F**3 ], |
|
142
|
|
|
|
|
|
|
[ $F, $F**2, $F**3 ], |
|
143
|
|
|
|
|
|
|
[ 0, $F, $F**3 ], |
|
144
|
|
|
|
|
|
|
[ -$F, $F**2, $F**3 ], |
|
145
|
|
|
|
|
|
|
[ -$F**2, 0, $F**3 ], |
|
146
|
|
|
|
|
|
|
[ -$F, -$F**2, $F**3 ], |
|
147
|
|
|
|
|
|
|
[ 0, -$F, $F**3 ], |
|
148
|
|
|
|
|
|
|
[ $F, -$F**2, $F**3 ], |
|
149
|
|
|
|
|
|
|
[ $F**3, $F, $F**2 ], |
|
150
|
|
|
|
|
|
|
[ $F**2, $F**2, $F**2 ], |
|
151
|
|
|
|
|
|
|
[ 0, $F**3, $F**2 ], |
|
152
|
|
|
|
|
|
|
[ -$F**2, $F**2, $F**2 ], |
|
153
|
|
|
|
|
|
|
[ -$F**3, $F, $F**2 ], |
|
154
|
|
|
|
|
|
|
[ -$F**3, -$F, $F**2 ], |
|
155
|
|
|
|
|
|
|
[ -$F**2, -$F**2, $F**2 ], |
|
156
|
|
|
|
|
|
|
[ 0, -$F**3, $F**2 ], |
|
157
|
|
|
|
|
|
|
[ $F**2, -$F**2, $F**2 ], |
|
158
|
|
|
|
|
|
|
[ $F**3, -$F, $F**2 ], |
|
159
|
|
|
|
|
|
|
[ $F**3, 0, $F ], |
|
160
|
|
|
|
|
|
|
[ $F**2, $F**3, $F ], |
|
161
|
|
|
|
|
|
|
[ -$F**2, $F**3, $F ], |
|
162
|
|
|
|
|
|
|
[ -$F**3, 0, $F ], |
|
163
|
|
|
|
|
|
|
[ -$F**2, -$F**3, $F ], |
|
164
|
|
|
|
|
|
|
[ $F**2, -$F**3, $F ], |
|
165
|
|
|
|
|
|
|
[ 2*$F**2, 0, 0 ], |
|
166
|
|
|
|
|
|
|
[ $F**3, $F**2, 0 ], |
|
167
|
|
|
|
|
|
|
[ $F, $F**3, 0 ], |
|
168
|
|
|
|
|
|
|
[ 0, 2*$F**2, 0 ], |
|
169
|
|
|
|
|
|
|
[ -$F, $F**3, 0 ], |
|
170
|
|
|
|
|
|
|
[ -$F**3, $F**2, 0 ], |
|
171
|
|
|
|
|
|
|
[ -2*$F**2, 0, 0 ], |
|
172
|
|
|
|
|
|
|
[ -$F**3, -$F**2, 0 ], |
|
173
|
|
|
|
|
|
|
[ -$F, -$F**3, 0 ], |
|
174
|
|
|
|
|
|
|
[ 0, -2*$F**2, 0 ], |
|
175
|
|
|
|
|
|
|
[ $F, -$F**3, 0 ], |
|
176
|
|
|
|
|
|
|
[ $F**3, -$F**2, 0 ], |
|
177
|
|
|
|
|
|
|
[ $F**3, 0, -$F ], |
|
178
|
|
|
|
|
|
|
[ $F**2, $F**3, -$F ], |
|
179
|
|
|
|
|
|
|
[ -$F**2, $F**3, -$F ], |
|
180
|
|
|
|
|
|
|
[ -$F**3, 0, -$F ], |
|
181
|
|
|
|
|
|
|
[ -$F**2, -$F**3, -$F ], |
|
182
|
|
|
|
|
|
|
[ $F**2, -$F**3, -$F ], |
|
183
|
|
|
|
|
|
|
[ $F**3, $F, -$F**2 ], |
|
184
|
|
|
|
|
|
|
[ $F**2, $F**2, -$F**2 ], |
|
185
|
|
|
|
|
|
|
[ 0, $F**3, -$F**2 ], |
|
186
|
|
|
|
|
|
|
[ -$F**2, $F**2, -$F**2 ], |
|
187
|
|
|
|
|
|
|
[ -$F**3, $F, -$F**2 ], |
|
188
|
|
|
|
|
|
|
[ -$F**3, -$F, -$F**2 ], |
|
189
|
|
|
|
|
|
|
[ -$F**2, -$F**2, -$F**2 ], |
|
190
|
|
|
|
|
|
|
[ 0, -$F**3, -$F**2 ], |
|
191
|
|
|
|
|
|
|
[ $F**2, -$F**2, -$F**2 ], |
|
192
|
|
|
|
|
|
|
[ $F**3, -$F, -$F**2 ], |
|
193
|
|
|
|
|
|
|
[ $F**2, 0, -$F**3 ], |
|
194
|
|
|
|
|
|
|
[ $F, $F**2, -$F**3 ], |
|
195
|
|
|
|
|
|
|
[ 0, $F, -$F**3 ], |
|
196
|
|
|
|
|
|
|
[ -$F, $F**2, -$F**3 ], |
|
197
|
|
|
|
|
|
|
[ -$F**2, 0, -$F**3 ], |
|
198
|
|
|
|
|
|
|
[ -$F, -$F**2, -$F**3 ], |
|
199
|
|
|
|
|
|
|
[ 0, -$F, -$F**3 ], |
|
200
|
|
|
|
|
|
|
[ $F, -$F**2, -$F**3 ], |
|
201
|
|
|
|
|
|
|
[ 0, 0, -2*$F**2 ] ]; |
|
202
|
|
|
|
|
|
|
|
|
203
|
|
|
|
|
|
|
# Convert the vectors if the application supplies a method. |
|
204
|
1
|
50
|
33
|
|
|
9
|
if ($_[0] and "CODE" eq ref($_[0])) |
|
205
|
|
|
|
|
|
|
{ |
|
206
|
|
|
|
|
|
|
eval |
|
207
|
0
|
|
|
|
|
0
|
{ |
|
208
|
0
|
|
|
|
|
0
|
my $convert = shift; |
|
209
|
0
|
|
|
|
|
0
|
foreach (@$Coords) |
|
210
|
|
|
|
|
|
|
{ |
|
211
|
0
|
0
|
|
|
|
0
|
next if not $_; |
|
212
|
0
|
|
|
|
|
0
|
$_ = &$convert($_); |
|
213
|
|
|
|
|
|
|
} |
|
214
|
|
|
|
|
|
|
}; |
|
215
|
0
|
0
|
|
|
|
0
|
print "died: $@" if $@; |
|
216
|
|
|
|
|
|
|
} |
|
217
|
|
|
|
|
|
|
|
|
218
|
|
|
|
|
|
|
# This coordinate set is blessed so we can identify it in later calls. |
|
219
|
1
|
|
|
|
|
4
|
bless($Coords, __PACKAGE__); |
|
220
|
1
|
|
|
|
|
3
|
return $Coords; |
|
221
|
|
|
|
|
|
|
} |
|
222
|
|
|
|
|
|
|
|
|
223
|
|
|
|
|
|
|
#---------------------------------------------------------------------------- |
|
224
|
|
|
|
|
|
|
|
|
225
|
|
|
|
|
|
|
# Ten different regular four-sided tetrahedra can be found. |
|
226
|
|
|
|
|
|
|
# |
|
227
|
|
|
|
|
|
|
my $Tetrahedra = |
|
228
|
|
|
|
|
|
|
[ { Verts => [4, 34, 38, 47], |
|
229
|
|
|
|
|
|
|
Edges => [[4, 34], [4, 38], [4, 47], |
|
230
|
|
|
|
|
|
|
[34, 38], [34, 47], [38, 47]], |
|
231
|
|
|
|
|
|
|
Faces => [[4, 47, 34], [4, 34, 38], |
|
232
|
|
|
|
|
|
|
[4, 38, 47], [34, 47, 38]] }, |
|
233
|
|
|
|
|
|
|
{ Verts => [18, 23, 28, 60], |
|
234
|
|
|
|
|
|
|
Edges => [[18, 23], [18, 28], [18, 60], |
|
235
|
|
|
|
|
|
|
[23, 28], [23, 60], [28, 60]], |
|
236
|
|
|
|
|
|
|
Faces => [[18, 28, 23], [18, 23, 60], |
|
237
|
|
|
|
|
|
|
[18, 60, 28], [23, 28, 60]] }, |
|
238
|
|
|
|
|
|
|
{ Verts => [4, 36, 41, 45], |
|
239
|
|
|
|
|
|
|
Edges => [[4, 36], [4, 41], [4, 45], |
|
240
|
|
|
|
|
|
|
[36, 41], [36, 45], [41, 45]], |
|
241
|
|
|
|
|
|
|
Faces => [[4, 41, 36], [4, 36, 45], |
|
242
|
|
|
|
|
|
|
[4, 45, 41], [36, 41, 45]] }, |
|
243
|
|
|
|
|
|
|
{ Verts => [16, 20, 30, 60], |
|
244
|
|
|
|
|
|
|
Edges => [[16, 20], [16, 30], [16, 60], |
|
245
|
|
|
|
|
|
|
[20, 30], [20, 60], [30, 60]], |
|
246
|
|
|
|
|
|
|
Faces => [[16, 20, 30], [16, 60, 20], |
|
247
|
|
|
|
|
|
|
[16, 30, 60], [20, 60, 30]] }, |
|
248
|
|
|
|
|
|
|
{ Verts => [8, 28, 41, 52], |
|
249
|
|
|
|
|
|
|
Edges => [[8, 28], [8, 41], [8, 52], |
|
250
|
|
|
|
|
|
|
[28, 41], [28, 52], [41, 52]], |
|
251
|
|
|
|
|
|
|
Faces => [[8, 28, 41], [8, 52, 28], |
|
252
|
|
|
|
|
|
|
[8, 41, 52], [28, 52, 41]] }, |
|
253
|
|
|
|
|
|
|
{ Verts => [13, 20, 34, 56], |
|
254
|
|
|
|
|
|
|
Edges => [[13, 20], [13, 34], [13, 56], |
|
255
|
|
|
|
|
|
|
[20, 34], [20, 56], [34, 56]], |
|
256
|
|
|
|
|
|
|
Faces => [[13, 34, 20], [13, 20, 56], |
|
257
|
|
|
|
|
|
|
[13, 56, 34], [20, 34, 56]] }, |
|
258
|
|
|
|
|
|
|
{ Verts => [8, 30, 38, 50], |
|
259
|
|
|
|
|
|
|
Edges => [[8, 30], [8, 38], [8, 50], |
|
260
|
|
|
|
|
|
|
[30, 38], [30, 50], [38, 50]], |
|
261
|
|
|
|
|
|
|
Faces => [[8, 38, 30], [8, 30, 50], |
|
262
|
|
|
|
|
|
|
[8, 50, 38], [30, 38, 50]] }, |
|
263
|
|
|
|
|
|
|
{ Verts => [11, 23, 36, 56], |
|
264
|
|
|
|
|
|
|
Edges => [[11, 23], [11, 36], [11, 56], |
|
265
|
|
|
|
|
|
|
[23, 36], [23, 56], [36, 56]], |
|
266
|
|
|
|
|
|
|
Faces => [[11, 23, 36], [11, 56, 23], |
|
267
|
|
|
|
|
|
|
[11, 36, 56], [23, 56, 36]] }, |
|
268
|
|
|
|
|
|
|
{ Verts => [11, 16, 47, 52], |
|
269
|
|
|
|
|
|
|
Edges => [[11, 16], [11, 47], [11, 52], |
|
270
|
|
|
|
|
|
|
[16, 47], [16, 52], [47, 52]], |
|
271
|
|
|
|
|
|
|
Faces => [[47, 16, 11], [52, 47, 11], |
|
272
|
|
|
|
|
|
|
[16, 52, 11], [47, 52, 16]] }, |
|
273
|
|
|
|
|
|
|
{ Verts => [13, 18, 45, 50], |
|
274
|
|
|
|
|
|
|
Edges => [[13, 18], [13, 45], [13, 50], |
|
275
|
|
|
|
|
|
|
[18, 45], [18, 50], [45, 50]], |
|
276
|
|
|
|
|
|
|
Faces => [[13, 18, 45], [18, 13, 50], |
|
277
|
|
|
|
|
|
|
[13, 45, 50], [18, 50, 45]] } ]; |
|
278
|
|
|
|
|
|
|
|
|
279
|
|
|
|
|
|
|
#---------------------------------------------------------------------------- |
|
280
|
|
|
|
|
|
|
|
|
281
|
|
|
|
|
|
|
# Five different regular six-sided sexahedra (cubes) can be found. |
|
282
|
|
|
|
|
|
|
# Each square face is a pair of triangles. |
|
283
|
|
|
|
|
|
|
# |
|
284
|
|
|
|
|
|
|
my $Sexahedra = |
|
285
|
|
|
|
|
|
|
[ { Verts => [4, 18, 23, 28, 34, 38, 47, 60], |
|
286
|
|
|
|
|
|
|
Edges => [ [4, 18], [18, 38], [38, 28], |
|
287
|
|
|
|
|
|
|
[28, 4], [4, 23], [18, 34], |
|
288
|
|
|
|
|
|
|
[28, 47], [38, 60], [23, 34], |
|
289
|
|
|
|
|
|
|
[34, 60], [60, 47], [47, 23] ], |
|
290
|
|
|
|
|
|
|
Faces => [ [[4, 18, 38], [38, 28, 4]], |
|
291
|
|
|
|
|
|
|
[[4, 23, 18], [18, 23, 34]], |
|
292
|
|
|
|
|
|
|
[[4, 28, 47], [4, 47, 23]], |
|
293
|
|
|
|
|
|
|
[[28, 38, 60], [28, 60, 47]], |
|
294
|
|
|
|
|
|
|
[[23, 47, 34], [47, 60, 34]], |
|
295
|
|
|
|
|
|
|
[[38, 18, 60], [18, 34, 60]] ] }, |
|
296
|
|
|
|
|
|
|
{ Verts => [4, 16, 20, 30, 36, 41, 45, 60], |
|
297
|
|
|
|
|
|
|
Edges => [ [4, 16], [16, 36], [36, 20], |
|
298
|
|
|
|
|
|
|
[20, 4], [4, 30], [16, 41], |
|
299
|
|
|
|
|
|
|
[20, 45], [36, 60], [30, 41], |
|
300
|
|
|
|
|
|
|
[41, 60], [60, 45], [45, 30] ], |
|
301
|
|
|
|
|
|
|
Faces => [ [[4, 16, 20], [16, 36, 20]], |
|
302
|
|
|
|
|
|
|
[[4, 20, 45], [4, 45, 30]], |
|
303
|
|
|
|
|
|
|
[[4, 30, 41], [4, 41, 16]], |
|
304
|
|
|
|
|
|
|
[[45, 41, 30], [45, 60, 41]], |
|
305
|
|
|
|
|
|
|
[[20, 36, 60], [20, 60, 45]], |
|
306
|
|
|
|
|
|
|
[[36, 16, 41], [36, 41, 60]] ] }, |
|
307
|
|
|
|
|
|
|
{ Verts => [8, 13, 20, 28, 34, 41, 52, 56], |
|
308
|
|
|
|
|
|
|
Edges => [ [8, 13], [13, 28], [28, 20], |
|
309
|
|
|
|
|
|
|
[20, 8], [8, 34], [13, 41], |
|
310
|
|
|
|
|
|
|
[28, 56], [20, 52], [34, 41], |
|
311
|
|
|
|
|
|
|
[41, 56], [56, 52], [52, 34] ], |
|
312
|
|
|
|
|
|
|
Faces => [ [[8, 20, 13], [13, 20, 28]], |
|
313
|
|
|
|
|
|
|
[[8, 52, 20], [8, 34, 52]], |
|
314
|
|
|
|
|
|
|
[[8, 41, 34], [8, 13, 41]], |
|
315
|
|
|
|
|
|
|
[[20, 56, 28], [20, 52, 56]], |
|
316
|
|
|
|
|
|
|
[[52, 41, 56], [52, 34, 41]], |
|
317
|
|
|
|
|
|
|
[[28, 41, 13], [28, 56, 41]] ] }, |
|
318
|
|
|
|
|
|
|
{ Verts => [8, 11, 23, 30, 36, 38, 50, 56], |
|
319
|
|
|
|
|
|
|
Edges => [ [8, 11], [11, 30], [30, 23], |
|
320
|
|
|
|
|
|
|
[23, 8], [8, 36], [11, 38], |
|
321
|
|
|
|
|
|
|
[23, 50], [30, 56], [36, 38], |
|
322
|
|
|
|
|
|
|
[38, 56], [56, 50], [50, 36] ], |
|
323
|
|
|
|
|
|
|
Faces => [ [[8, 11, 23], [11, 30, 23]], |
|
324
|
|
|
|
|
|
|
[[8, 23, 50], [8, 50, 36]], |
|
325
|
|
|
|
|
|
|
[[8, 36, 38], [8, 38, 11]], |
|
326
|
|
|
|
|
|
|
[[23, 30, 56], [23, 56, 50]], |
|
327
|
|
|
|
|
|
|
[[50, 56, 38], [50, 38, 36]], |
|
328
|
|
|
|
|
|
|
[[30, 11, 56], [11, 38, 56]] ] }, |
|
329
|
|
|
|
|
|
|
{ Verts => [11, 13, 16, 18, 45, 47, 50, 52], |
|
330
|
|
|
|
|
|
|
Edges => [ [11, 13], [13, 16], [16, 18], |
|
331
|
|
|
|
|
|
|
[18, 11], [11, 45], [13, 47], |
|
332
|
|
|
|
|
|
|
[16, 50], [18, 52], [45, 47], |
|
333
|
|
|
|
|
|
|
[47, 50], [50, 52], [52, 45] ], |
|
334
|
|
|
|
|
|
|
Faces => [ [[11, 13, 16], [11, 16, 18]], |
|
335
|
|
|
|
|
|
|
[[11, 45, 47], [11, 47, 13]], |
|
336
|
|
|
|
|
|
|
[[13, 47, 50], [13, 50, 16]], |
|
337
|
|
|
|
|
|
|
[[16, 50, 52], [16, 52, 18]], |
|
338
|
|
|
|
|
|
|
[[18, 52, 45], [18, 45, 11]], |
|
339
|
|
|
|
|
|
|
[[45, 52, 50], [45, 50, 47]] ] } ]; |
|
340
|
|
|
|
|
|
|
|
|
341
|
|
|
|
|
|
|
#---------------------------------------------------------------------------- |
|
342
|
|
|
|
|
|
|
|
|
343
|
|
|
|
|
|
|
# Five different regular eight-sided octahedra can be found. |
|
344
|
|
|
|
|
|
|
# |
|
345
|
|
|
|
|
|
|
my $Octahedra = |
|
346
|
|
|
|
|
|
|
[ { Verts => [7, 10, 22, 43, 49, 55], |
|
347
|
|
|
|
|
|
|
Edges => [ [7, 10], [7, 22], [7, 43], |
|
348
|
|
|
|
|
|
|
[7, 49], [10, 22], [10, 43], |
|
349
|
|
|
|
|
|
|
[22, 49], [43, 49], [10, 55], |
|
350
|
|
|
|
|
|
|
[22, 55], [43, 55], [49, 55] ], |
|
351
|
|
|
|
|
|
|
Faces => [ [7, 43, 10], [7, 10, 22], |
|
352
|
|
|
|
|
|
|
[7, 49, 43], [7, 22, 49], |
|
353
|
|
|
|
|
|
|
[55, 10, 43], [55, 22, 10], |
|
354
|
|
|
|
|
|
|
[55, 43, 49], [55, 49, 22] ] }, |
|
355
|
|
|
|
|
|
|
{ Verts => [9, 14, 21, 42, 53, 57], |
|
356
|
|
|
|
|
|
|
Edges => [ [9, 14], [9, 21], [9, 42], |
|
357
|
|
|
|
|
|
|
[9, 53], [14, 21], [14, 42], |
|
358
|
|
|
|
|
|
|
[21, 53], [42, 53], [14, 57], |
|
359
|
|
|
|
|
|
|
[21, 57], [42, 57], [53, 57] ], |
|
360
|
|
|
|
|
|
|
Faces => [ [9, 21, 14], [9, 53, 21], |
|
361
|
|
|
|
|
|
|
[9, 14, 42], [9, 42, 53], |
|
362
|
|
|
|
|
|
|
[57, 14, 21], [57, 21, 53], |
|
363
|
|
|
|
|
|
|
[57, 42, 14], [57, 53, 42] ] }, |
|
364
|
|
|
|
|
|
|
{ Verts => [3, 15, 25, 40, 44, 59], |
|
365
|
|
|
|
|
|
|
Edges => [ [3, 15], [3, 25], [3, 40], |
|
366
|
|
|
|
|
|
|
[3, 44], [15, 25], [15, 40], |
|
367
|
|
|
|
|
|
|
[40, 44], [25, 44], [25, 59], |
|
368
|
|
|
|
|
|
|
[15, 59], [40, 59], [44, 59] ], |
|
369
|
|
|
|
|
|
|
Faces => [ [3, 15, 25], [3, 25, 44], |
|
370
|
|
|
|
|
|
|
[3, 40, 15], [3, 44, 40], |
|
371
|
|
|
|
|
|
|
[59, 25, 15], [59, 15, 40], |
|
372
|
|
|
|
|
|
|
[59, 40, 44], [59, 44, 25] ] }, |
|
373
|
|
|
|
|
|
|
{ Verts => [5, 19, 24, 39, 48, 61], |
|
374
|
|
|
|
|
|
|
Edges => [ [5, 19], [5, 24], [5, 39], |
|
375
|
|
|
|
|
|
|
[5, 48], [19, 24], [19, 39], |
|
376
|
|
|
|
|
|
|
[24, 48], [39, 48], [19, 61], |
|
377
|
|
|
|
|
|
|
[24, 61], [39, 61], [48, 61] ], |
|
378
|
|
|
|
|
|
|
Faces => [ [5, 19, 39], [5, 24, 19], |
|
379
|
|
|
|
|
|
|
[5, 39, 48], [5, 48, 24], |
|
380
|
|
|
|
|
|
|
[61, 39, 19], [61, 19, 24], |
|
381
|
|
|
|
|
|
|
[61, 48, 39], [61, 24, 48] ] }, |
|
382
|
|
|
|
|
|
|
{ Verts => [1, 26, 29, 32, 35, 62], |
|
383
|
|
|
|
|
|
|
Edges => [ [1, 26], [1, 29], [1, 32], |
|
384
|
|
|
|
|
|
|
[1, 35], [26, 29], [29, 32], |
|
385
|
|
|
|
|
|
|
[32, 35], [35, 26], [62, 26], |
|
386
|
|
|
|
|
|
|
[62, 29], [62, 32], [62, 35] ], |
|
387
|
|
|
|
|
|
|
Faces => [ [1, 26, 29], [1, 29, 32], |
|
388
|
|
|
|
|
|
|
[1, 32, 35], [1, 35, 26], |
|
389
|
|
|
|
|
|
|
[62, 29, 26], [62, 32, 29], |
|
390
|
|
|
|
|
|
|
[62, 35, 32], [62, 26, 35] ] } ]; |
|
391
|
|
|
|
|
|
|
|
|
392
|
|
|
|
|
|
|
#---------------------------------------------------------------------------- |
|
393
|
|
|
|
|
|
|
|
|
394
|
|
|
|
|
|
|
# Five different rhombic twelve-sided dodecahedra can be found. |
|
395
|
|
|
|
|
|
|
# Each rhomboid face is a pair of triangles. |
|
396
|
|
|
|
|
|
|
# |
|
397
|
|
|
|
|
|
|
my $RhombicDodecahedra = |
|
398
|
|
|
|
|
|
|
[ { Verts => [4, 7, 10, 18, 22, 23, 28, 34, 38, 43, 47, 49, 55, 60], |
|
399
|
|
|
|
|
|
|
Edges => [ [7, 4], [7, 18], [7, 23], |
|
400
|
|
|
|
|
|
|
[7, 34], [10, 4], [10, 18], |
|
401
|
|
|
|
|
|
|
[10, 28], [10, 38], [22, 4], |
|
402
|
|
|
|
|
|
|
[22, 23], [22, 28], [22, 47], |
|
403
|
|
|
|
|
|
|
[43, 18], [43, 34], [43, 38], |
|
404
|
|
|
|
|
|
|
[43, 60], [49, 23], [49, 34], |
|
405
|
|
|
|
|
|
|
[49, 47], [49, 60], [55, 28], |
|
406
|
|
|
|
|
|
|
[55, 38], [55, 47], [55, 60] ], |
|
407
|
|
|
|
|
|
|
Faces => [ [[4, 7, 18], [10, 4, 18]], |
|
408
|
|
|
|
|
|
|
[[7, 34, 18], [43, 18, 34]], |
|
409
|
|
|
|
|
|
|
[[7, 23, 34], [49, 34, 23]], |
|
410
|
|
|
|
|
|
|
[[7, 4, 23], [4, 22, 23]], |
|
411
|
|
|
|
|
|
|
[[22, 4, 28], [4, 10, 28]], |
|
412
|
|
|
|
|
|
|
[[10, 18, 43], [38, 10, 43]], |
|
413
|
|
|
|
|
|
|
[[34, 49, 43], [49, 60, 43]], |
|
414
|
|
|
|
|
|
|
[[23, 22, 49], [47, 49, 22]], |
|
415
|
|
|
|
|
|
|
[[55, 38, 60], [38, 43, 60]], |
|
416
|
|
|
|
|
|
|
[[55, 60, 47], [49, 47, 60]], |
|
417
|
|
|
|
|
|
|
[[55, 47, 28], [22, 28, 47]], |
|
418
|
|
|
|
|
|
|
[[55, 28, 38], [28, 10, 38]] ] }, |
|
419
|
|
|
|
|
|
|
{ Verts => [4, 9, 14, 16, 20, 21, 30, 36, 41, 42, 45, 53, 57, 60], |
|
420
|
|
|
|
|
|
|
Edges => [ [9, 4], [9, 16], [9, 20], |
|
421
|
|
|
|
|
|
|
[9, 36], [14, 4], [14, 16], |
|
422
|
|
|
|
|
|
|
[14, 30], [14, 41], [21, 4], |
|
423
|
|
|
|
|
|
|
[21, 20], [21, 30], [21, 45], |
|
424
|
|
|
|
|
|
|
[42, 16], [42, 36], [42, 41], |
|
425
|
|
|
|
|
|
|
[42, 60], [53, 20], [53, 36], |
|
426
|
|
|
|
|
|
|
[53, 45], [53, 60], [57, 30], |
|
427
|
|
|
|
|
|
|
[57, 41], [57, 45], [57, 60] ], |
|
428
|
|
|
|
|
|
|
Faces => [ [[9, 4, 16], [4, 14, 16]], |
|
429
|
|
|
|
|
|
|
[[9, 16, 36], [16, 42, 36]], |
|
430
|
|
|
|
|
|
|
[[9, 36, 20], [53, 20, 36]], |
|
431
|
|
|
|
|
|
|
[[9, 20, 4], [21, 4, 20]], |
|
432
|
|
|
|
|
|
|
[[14, 4, 30], [21, 30, 4]], |
|
433
|
|
|
|
|
|
|
[[16, 14, 42], [41, 42, 14]], |
|
434
|
|
|
|
|
|
|
[[36, 42, 53], [60, 53, 42]], |
|
435
|
|
|
|
|
|
|
[[20, 53, 21], [45, 21, 53]], |
|
436
|
|
|
|
|
|
|
[[42, 41, 60], [57, 60, 41]], |
|
437
|
|
|
|
|
|
|
[[53, 60, 45], [57, 45, 60]], |
|
438
|
|
|
|
|
|
|
[[21, 45, 30], [57, 30, 45]], |
|
439
|
|
|
|
|
|
|
[[14, 30, 41], [57, 41, 30]] ] }, |
|
440
|
|
|
|
|
|
|
{ Verts => [3, 8, 13, 15, 20, 25, 28, 34, 40, 41, 44, 52, 56, 59], |
|
441
|
|
|
|
|
|
|
Edges => [ [3, 8], [3, 13], [3, 20], |
|
442
|
|
|
|
|
|
|
[3, 28], [15, 8], [15, 13], |
|
443
|
|
|
|
|
|
|
[15, 34], [15, 41], [25, 8], |
|
444
|
|
|
|
|
|
|
[25, 20], [25, 34], [25, 52], |
|
445
|
|
|
|
|
|
|
[40, 13], [40, 28], [40, 41], |
|
446
|
|
|
|
|
|
|
[40, 56], [44, 20], [44, 28], |
|
447
|
|
|
|
|
|
|
[44, 52], [44, 56], [59, 34], |
|
448
|
|
|
|
|
|
|
[59, 41], [59, 52], [59, 56] ], |
|
449
|
|
|
|
|
|
|
Faces => [ [[3, 13, 8], [15, 8, 13]], |
|
450
|
|
|
|
|
|
|
[[3, 28, 13], [40, 13, 28]], |
|
451
|
|
|
|
|
|
|
[[3, 20, 28], [44, 28, 20]], |
|
452
|
|
|
|
|
|
|
[[3, 8, 20], [25, 20, 8]], |
|
453
|
|
|
|
|
|
|
[[8, 15, 25], [34, 25, 15]], |
|
454
|
|
|
|
|
|
|
[[13, 40, 15], [41, 15, 40]], |
|
455
|
|
|
|
|
|
|
[[28, 44, 40], [56, 40, 44]], |
|
456
|
|
|
|
|
|
|
[[20, 25, 44], [52, 44, 25]], |
|
457
|
|
|
|
|
|
|
[[15, 41, 34], [59, 34, 41]], |
|
458
|
|
|
|
|
|
|
[[40, 56, 41], [59, 41, 56]], |
|
459
|
|
|
|
|
|
|
[[44, 52, 56], [59, 56, 52]], |
|
460
|
|
|
|
|
|
|
[[25, 34, 52], [59, 52, 34]] ] }, |
|
461
|
|
|
|
|
|
|
{ Verts => [5, 8, 11, 19, 23, 24, 30, 36, 38, 39, 48, 50, 56, 61], |
|
462
|
|
|
|
|
|
|
Edges => [ [5, 8], [5, 11], [5, 23], |
|
463
|
|
|
|
|
|
|
[5, 30], [19, 8], [19, 11], |
|
464
|
|
|
|
|
|
|
[19, 36], [19, 38], [24, 8], |
|
465
|
|
|
|
|
|
|
[24, 23], [24, 36], [24, 50], |
|
466
|
|
|
|
|
|
|
[39, 11], [39, 30], [39, 38], |
|
467
|
|
|
|
|
|
|
[39, 56], [48, 23], [48, 30], |
|
468
|
|
|
|
|
|
|
[48, 50], [48, 56], [61, 36], |
|
469
|
|
|
|
|
|
|
[61, 38], [61, 50], [61, 56] ], |
|
470
|
|
|
|
|
|
|
Faces => [ [[5, 8, 11], [8, 19, 11]], |
|
471
|
|
|
|
|
|
|
[[5, 11, 30], [11, 39, 30]], |
|
472
|
|
|
|
|
|
|
[[5, 30, 23], [30, 48, 23]], |
|
473
|
|
|
|
|
|
|
[[5, 23, 8], [23, 24, 8]], |
|
474
|
|
|
|
|
|
|
[[8, 24, 19], [36, 19, 24]], |
|
475
|
|
|
|
|
|
|
[[11, 19, 39], [19, 38, 39]], |
|
476
|
|
|
|
|
|
|
[[30, 39, 48], [39, 56, 48]], |
|
477
|
|
|
|
|
|
|
[[23, 48, 24], [48, 50, 24]], |
|
478
|
|
|
|
|
|
|
[[19, 36, 38], [61, 38, 36]], |
|
479
|
|
|
|
|
|
|
[[39, 38, 56], [61, 56, 38]], |
|
480
|
|
|
|
|
|
|
[[48, 56, 50], [61, 50, 56]], |
|
481
|
|
|
|
|
|
|
[[24, 50, 36], [61, 36, 50]] ] }, |
|
482
|
|
|
|
|
|
|
{ Verts => [1, 11, 13, 16, 18, 26, 29, 32, 35, 45, 47, 50, 52, 62], |
|
483
|
|
|
|
|
|
|
Edges => [ [1, 11], [1, 13], [1, 16], |
|
484
|
|
|
|
|
|
|
[1, 18], [26, 18], [26, 11], |
|
485
|
|
|
|
|
|
|
[26, 45], [26, 52], [29, 11], |
|
486
|
|
|
|
|
|
|
[29, 13], [29, 47], [29, 45], |
|
487
|
|
|
|
|
|
|
[32, 13], [32, 16], [32, 50], |
|
488
|
|
|
|
|
|
|
[32, 47], [35, 16], [35, 18], |
|
489
|
|
|
|
|
|
|
[35, 52], [35, 50], [62, 45], |
|
490
|
|
|
|
|
|
|
[62, 47], [62, 50], [62, 52] ], |
|
491
|
|
|
|
|
|
|
Faces => [ [[1, 11, 29], [29, 13, 1]], |
|
492
|
|
|
|
|
|
|
[[1, 13, 32], [32, 16, 1]], |
|
493
|
|
|
|
|
|
|
[[1, 16, 35], [35, 18, 1]], |
|
494
|
|
|
|
|
|
|
[[1, 18, 26], [26, 11, 1]], |
|
495
|
|
|
|
|
|
|
[[26, 45, 29], [29, 11, 26]], |
|
496
|
|
|
|
|
|
|
[[29, 47, 32], [32, 13, 29]], |
|
497
|
|
|
|
|
|
|
[[32, 50, 35], [35, 16, 32]], |
|
498
|
|
|
|
|
|
|
[[35, 52, 26], [26, 18, 35]], |
|
499
|
|
|
|
|
|
|
[[62, 45, 26], [26, 52, 62]], |
|
500
|
|
|
|
|
|
|
[[62, 47, 29], [29, 45, 62]], |
|
501
|
|
|
|
|
|
|
[[62, 50, 32], [32, 47, 62]], |
|
502
|
|
|
|
|
|
|
[[62, 52, 35], [35, 50, 62]] ] } ]; |
|
503
|
|
|
|
|
|
|
|
|
504
|
|
|
|
|
|
|
#---------------------------------------------------------------------------- |
|
505
|
|
|
|
|
|
|
|
|
506
|
|
|
|
|
|
|
# One regular twelve-sided dodecahedron can be found. |
|
507
|
|
|
|
|
|
|
# Each regular pentagonal face is a triplet of triangles. |
|
508
|
|
|
|
|
|
|
# |
|
509
|
|
|
|
|
|
|
my $Dodecahedron = |
|
510
|
|
|
|
|
|
|
[ { Verts => [ 4, 8, 11, 13, 16, 18, 20, 23, 28, 30, |
|
511
|
|
|
|
|
|
|
34, 36, 38, 41, 45, 47, 50, 52, 56, 60 ], |
|
512
|
|
|
|
|
|
|
Edges => [ [4, 8], [4, 11], [4, 13], |
|
513
|
|
|
|
|
|
|
[8, 16], [8, 18], [11, 20], |
|
514
|
|
|
|
|
|
|
[11, 28], [13, 30], [13, 23], |
|
515
|
|
|
|
|
|
|
[16, 23], [16, 34], [18, 36], |
|
516
|
|
|
|
|
|
|
[18, 20], [20, 38], [23, 41], |
|
517
|
|
|
|
|
|
|
[28, 30], [28, 45], [30, 47], |
|
518
|
|
|
|
|
|
|
[34, 50], [34, 36], [36, 52], |
|
519
|
|
|
|
|
|
|
[38, 45], [38, 52], [41, 47], |
|
520
|
|
|
|
|
|
|
[41, 50], [45, 56], [47, 56], |
|
521
|
|
|
|
|
|
|
[50, 60], [52, 60], [56, 60] ], |
|
522
|
|
|
|
|
|
|
Faces => [ [[4, 8, 11], [11, 8, 18], [11, 18, 20]], |
|
523
|
|
|
|
|
|
|
[[4, 13, 23], [4, 23, 8], [8, 23, 16]], |
|
524
|
|
|
|
|
|
|
[[4, 11, 28], [4, 28, 30], [4, 30, 13]], |
|
525
|
|
|
|
|
|
|
[[8, 16, 34], [8, 34, 18], [18, 34, 36]], |
|
526
|
|
|
|
|
|
|
[[11, 20, 28], [20, 45, 28], [20, 38, 45]], |
|
527
|
|
|
|
|
|
|
[[13, 30, 23], [23, 30, 41], [41, 30, 47]], |
|
528
|
|
|
|
|
|
|
[[16, 23, 34], [34, 23, 50], [50, 23, 41]], |
|
529
|
|
|
|
|
|
|
[[18, 36, 52], [18, 52, 38], [18, 38, 20]], |
|
530
|
|
|
|
|
|
|
[[28, 45, 56], [28, 56, 47], [28, 47, 30]], |
|
531
|
|
|
|
|
|
|
[[34, 50, 60], [34, 60, 36], [36, 60, 52]], |
|
532
|
|
|
|
|
|
|
[[38, 52, 60], [38, 60, 56], [38, 56, 45]], |
|
533
|
|
|
|
|
|
|
[[41, 47, 56], [41, 56, 60], [41, 60, 50]] ] } ]; |
|
534
|
|
|
|
|
|
|
|
|
535
|
|
|
|
|
|
|
#---------------------------------------------------------------------------- |
|
536
|
|
|
|
|
|
|
|
|
537
|
|
|
|
|
|
|
# One regular twenty-sided icosahedron can be found. |
|
538
|
|
|
|
|
|
|
# |
|
539
|
|
|
|
|
|
|
my $Icosahedron = |
|
540
|
|
|
|
|
|
|
[ { Verts => [2, 6, 12, 17, 27, 31, 33, 37, 46, 51, 54, 58], |
|
541
|
|
|
|
|
|
|
Edges => [ [2, 6], [2, 12], [2, 17], |
|
542
|
|
|
|
|
|
|
[2, 37], [2, 27], [6, 12], |
|
543
|
|
|
|
|
|
|
[6, 17], [6, 31], [6, 33], |
|
544
|
|
|
|
|
|
|
[12, 27], [12, 46], [12, 31], |
|
545
|
|
|
|
|
|
|
[17, 33], [17, 51], [17, 37], |
|
546
|
|
|
|
|
|
|
[27, 37], [27, 54], [27, 46], |
|
547
|
|
|
|
|
|
|
[31, 46], [31, 58], [31, 33], |
|
548
|
|
|
|
|
|
|
[33, 58], [33, 51], [37, 51], |
|
549
|
|
|
|
|
|
|
[37, 54], [46, 54], [46, 58], |
|
550
|
|
|
|
|
|
|
[51, 54], [51, 58], [54, 58] ], |
|
551
|
|
|
|
|
|
|
Faces => [ [2, 6, 17], [2, 12, 6], [2, 17, 37], |
|
552
|
|
|
|
|
|
|
[2, 37, 27], [2, 27, 12], [37, 54, 27], |
|
553
|
|
|
|
|
|
|
[27, 54, 46], [27, 46, 12], [12, 46, 31], |
|
554
|
|
|
|
|
|
|
[12, 31, 6], [6, 31, 33], [6, 33, 17], |
|
555
|
|
|
|
|
|
|
[17, 33, 51], [17, 51, 37], [37, 51, 54], |
|
556
|
|
|
|
|
|
|
[58, 54, 51], [58, 46, 54], [58, 31, 46], |
|
557
|
|
|
|
|
|
|
[58, 33, 31], [58, 51, 33] ] } ]; |
|
558
|
|
|
|
|
|
|
|
|
559
|
|
|
|
|
|
|
#---------------------------------------------------------------------------- |
|
560
|
|
|
|
|
|
|
|
|
561
|
|
|
|
|
|
|
# One rhombic thirty-sided triacontahedron can be found. |
|
562
|
|
|
|
|
|
|
# Each rhomboid face is a pair of triangles. |
|
563
|
|
|
|
|
|
|
# |
|
564
|
|
|
|
|
|
|
my $RhombicTriacontahedron = |
|
565
|
|
|
|
|
|
|
[ { Verts => [ 2, 4, 6, 8, 11, 12, 13, 16, |
|
566
|
|
|
|
|
|
|
17, 18, 20, 23, 27, 28, 30, 31, |
|
567
|
|
|
|
|
|
|
33, 34, 36, 37, 38, 41, 45, 46, |
|
568
|
|
|
|
|
|
|
47, 50, 51, 52, 54, 56, 58, 60 ], |
|
569
|
|
|
|
|
|
|
Edges => [ [2, 4], [4, 6], [6, 8], |
|
570
|
|
|
|
|
|
|
[8, 2], [2, 11], [11, 12], |
|
571
|
|
|
|
|
|
|
[4, 12], [12, 13], [13, 6], |
|
572
|
|
|
|
|
|
|
[6, 23], [6, 16], [16, 17], |
|
573
|
|
|
|
|
|
|
[17, 8], [17, 18], [2, 18], |
|
574
|
|
|
|
|
|
|
[2, 20], [20, 27], [27, 28], |
|
575
|
|
|
|
|
|
|
[12, 28], [12, 30], [13, 31], |
|
576
|
|
|
|
|
|
|
[23, 31], [23, 33], [33, 16], |
|
577
|
|
|
|
|
|
|
[18, 37], [37, 20], [11, 27], |
|
578
|
|
|
|
|
|
|
[54, 56], [56, 58], [58, 60], |
|
579
|
|
|
|
|
|
|
[60, 54], [54, 45], [45, 46], |
|
580
|
|
|
|
|
|
|
[46, 56], [58, 47], [58, 41], |
|
581
|
|
|
|
|
|
|
[58, 50], [60, 51], [52, 54], |
|
582
|
|
|
|
|
|
|
[54, 38], [38, 27], [27, 45], |
|
583
|
|
|
|
|
|
|
[46, 47], [47, 31], [31, 41], |
|
584
|
|
|
|
|
|
|
[41, 33], [33, 50], [50, 51], |
|
585
|
|
|
|
|
|
|
[51, 52], [52, 37], [37, 38], |
|
586
|
|
|
|
|
|
|
[28, 46], [30, 46], [30, 31], |
|
587
|
|
|
|
|
|
|
[17, 36], [36, 51], [51, 34], |
|
588
|
|
|
|
|
|
|
[34, 17], [36, 37], [33, 34] ], |
|
589
|
|
|
|
|
|
|
Faces => [ [[2, 4, 6], [6, 8, 2]], |
|
590
|
|
|
|
|
|
|
[[2, 11, 4], [4, 11, 12]], |
|
591
|
|
|
|
|
|
|
[[4, 12, 13], [4, 13, 6]], |
|
592
|
|
|
|
|
|
|
[[6, 16, 8], [8, 16, 17]], |
|
593
|
|
|
|
|
|
|
[[8, 17, 18], [8, 18, 2]], |
|
594
|
|
|
|
|
|
|
[[2, 18, 37], [2, 37, 20]], |
|
595
|
|
|
|
|
|
|
[[2, 20, 27], [2, 27, 11]], |
|
596
|
|
|
|
|
|
|
[[11, 27, 28], [11, 28, 12]], |
|
597
|
|
|
|
|
|
|
[[6, 13, 31], [6, 31, 23]], |
|
598
|
|
|
|
|
|
|
[[6, 23, 33], [6, 33, 16]], |
|
599
|
|
|
|
|
|
|
[[54, 60, 58], [58, 56, 54]], |
|
600
|
|
|
|
|
|
|
[[54, 56, 45], [45, 56, 46]], |
|
601
|
|
|
|
|
|
|
[[56, 58, 47], [47, 46, 56]], |
|
602
|
|
|
|
|
|
|
[[47, 58, 41], [41, 31, 47]], |
|
603
|
|
|
|
|
|
|
[[58, 50, 33], [33, 41, 58]], |
|
604
|
|
|
|
|
|
|
[[58, 60, 51], [51, 50, 58]], |
|
605
|
|
|
|
|
|
|
[[60, 54, 52], [52, 51, 60]], |
|
606
|
|
|
|
|
|
|
[[54, 38, 37], [37, 52, 54]], |
|
607
|
|
|
|
|
|
|
[[45, 27, 38], [38, 54, 45]], |
|
608
|
|
|
|
|
|
|
[[20, 37, 38], [38, 27, 20]], |
|
609
|
|
|
|
|
|
|
[[23, 31, 41], [41, 33, 23]], |
|
610
|
|
|
|
|
|
|
[[12, 28, 46], [46, 30, 12]], |
|
611
|
|
|
|
|
|
|
[[12, 30, 31], [31, 13, 12]], |
|
612
|
|
|
|
|
|
|
[[31, 30, 46], [46, 47, 31]], |
|
613
|
|
|
|
|
|
|
[[28, 27, 45], [45, 46, 28]], |
|
614
|
|
|
|
|
|
|
[[17, 34, 51], [51, 36, 17]], |
|
615
|
|
|
|
|
|
|
[[18, 17, 36], [36, 37, 18]], |
|
616
|
|
|
|
|
|
|
[[37, 36, 51], [51, 52, 37]], |
|
617
|
|
|
|
|
|
|
[[17, 16, 33], [33, 34, 17]], |
|
618
|
|
|
|
|
|
|
[[34, 33, 50], [50, 51, 34]] ] } ]; |
|
619
|
|
|
|
|
|
|
|
|
620
|
|
|
|
|
|
|
# All of the points form a 120-sided figure. |
|
621
|
|
|
|
|
|
|
# What would that be called? I'm guessing it's a hexicosahedron (6*20). |
|
622
|
|
|
|
|
|
|
# Each rhomboid face is a pair of triangles. |
|
623
|
|
|
|
|
|
|
# |
|
624
|
|
|
|
|
|
|
my $Hexicosahedron = |
|
625
|
|
|
|
|
|
|
[ { Verts => [ 1, 2, 3, 4, 5, 6, 7, 8, 9, |
|
626
|
|
|
|
|
|
|
10, 11, 12, 13, 14, 15, 16, 17, 18, |
|
627
|
|
|
|
|
|
|
19, 20, 21, 22, 23, 24, 25, 26, 27, |
|
628
|
|
|
|
|
|
|
28, 29, 30, 31, 32, 33, 34, 35, 36, |
|
629
|
|
|
|
|
|
|
37, 38, 39, 40, 41, 42, 43, 44, 45, |
|
630
|
|
|
|
|
|
|
46, 47, 48, 49, 50, 51, 52, 53, 54, |
|
631
|
|
|
|
|
|
|
55, 56, 57, 58, 59, 60, 61, 62 ], |
|
632
|
|
|
|
|
|
|
Edges => [ [1, 2], [1, 4], [1, 6], |
|
633
|
|
|
|
|
|
|
[1, 8], [2, 3], [2, 4], |
|
634
|
|
|
|
|
|
|
[2, 8], [2, 9], [2, 10], |
|
635
|
|
|
|
|
|
|
[2, 11], [2, 18], [2, 19], |
|
636
|
|
|
|
|
|
|
[2, 20], [3, 4], [3, 11], |
|
637
|
|
|
|
|
|
|
[3, 12], [4, 5], [4, 6], |
|
638
|
|
|
|
|
|
|
[4, 12], [5, 6], [5, 12], |
|
639
|
|
|
|
|
|
|
[5, 13], [6, 7], [6, 8], |
|
640
|
|
|
|
|
|
|
[6, 13], [6, 14], [6, 15], |
|
641
|
|
|
|
|
|
|
[6, 16], [6, 23], [7, 8], |
|
642
|
|
|
|
|
|
|
[7, 16], [7, 17], [8, 9], |
|
643
|
|
|
|
|
|
|
[8, 17], [9, 17], [9, 18], |
|
644
|
|
|
|
|
|
|
[10, 11], [10, 20], [10, 27], |
|
645
|
|
|
|
|
|
|
[11, 12], [11, 21], [11, 27], |
|
646
|
|
|
|
|
|
|
[12, 13], [12, 21], [12, 28], |
|
647
|
|
|
|
|
|
|
[12, 29], [12, 22], [12, 30], |
|
648
|
|
|
|
|
|
|
[13, 14], [13, 22], [13, 31], |
|
649
|
|
|
|
|
|
|
[14, 23], [14, 31], [15, 16], |
|
650
|
|
|
|
|
|
|
[15, 23], [15, 33], [16, 17], |
|
651
|
|
|
|
|
|
|
[16, 24], [16, 33], [17, 18], |
|
652
|
|
|
|
|
|
|
[17, 24], [17, 25], [17, 34], |
|
653
|
|
|
|
|
|
|
[17, 35], [17, 36], [18, 19], |
|
654
|
|
|
|
|
|
|
[18, 25], [18, 37], [19, 20], |
|
655
|
|
|
|
|
|
|
[19, 37], [20, 26], [20, 27], |
|
656
|
|
|
|
|
|
|
[20, 37], [21, 27], [21, 28], |
|
657
|
|
|
|
|
|
|
[22, 30], [22, 31], [23, 31], |
|
658
|
|
|
|
|
|
|
[23, 32], [23, 33], [24, 33], |
|
659
|
|
|
|
|
|
|
[24, 34], [25, 36], [25, 37], |
|
660
|
|
|
|
|
|
|
[26, 27], [26, 37], [26, 38], |
|
661
|
|
|
|
|
|
|
[27, 28], [27, 38], [27, 39], |
|
662
|
|
|
|
|
|
|
[27, 44], [27, 45], [28, 29], |
|
663
|
|
|
|
|
|
|
[28, 39], [28, 46], [29, 30], |
|
664
|
|
|
|
|
|
|
[29, 46], [30, 31], [30, 40], |
|
665
|
|
|
|
|
|
|
[30, 46], [31, 32], [31, 40], |
|
666
|
|
|
|
|
|
|
[31, 41], [31, 47], [31, 48], |
|
667
|
|
|
|
|
|
|
[32, 33], [32, 41], [33, 34], |
|
668
|
|
|
|
|
|
|
[33, 41], [33, 42], [33, 49], |
|
669
|
|
|
|
|
|
|
[33, 50], [34, 35], [34, 42], |
|
670
|
|
|
|
|
|
|
[34, 51], [35, 36], [35, 51], |
|
671
|
|
|
|
|
|
|
[36, 37], [36, 43], [36, 51], |
|
672
|
|
|
|
|
|
|
[37, 38], [37, 43], [37, 52], |
|
673
|
|
|
|
|
|
|
[37, 53], [38, 44], [38, 53], |
|
674
|
|
|
|
|
|
|
[38, 54], [39, 45], [39, 46], |
|
675
|
|
|
|
|
|
|
[40, 46], [40, 47], [41, 48], |
|
676
|
|
|
|
|
|
|
[41, 49], [41, 58], [42, 50], |
|
677
|
|
|
|
|
|
|
[42, 51], [43, 51], [43, 52], |
|
678
|
|
|
|
|
|
|
[44, 45], [44, 54], [45, 55], |
|
679
|
|
|
|
|
|
|
[45, 46], [46, 47], [46, 55], |
|
680
|
|
|
|
|
|
|
[46, 56], [46, 57], [47, 48], |
|
681
|
|
|
|
|
|
|
[47, 57], [47, 58], [48, 58], |
|
682
|
|
|
|
|
|
|
[49, 50], [49, 58], [50, 51], |
|
683
|
|
|
|
|
|
|
[50, 58], [50, 59], [51, 52], |
|
684
|
|
|
|
|
|
|
[51, 59], [51, 60], [51, 61], |
|
685
|
|
|
|
|
|
|
[52, 53], [52, 61], [52, 54], |
|
686
|
|
|
|
|
|
|
[53, 54], [54, 55], [54, 56], |
|
687
|
|
|
|
|
|
|
[54, 60], [54, 61], [54, 62], |
|
688
|
|
|
|
|
|
|
[55, 56], [56, 57], [56, 58], |
|
689
|
|
|
|
|
|
|
[56, 62], [57, 58], [58, 59], |
|
690
|
|
|
|
|
|
|
[58, 60], [58, 62], [59, 60], |
|
691
|
|
|
|
|
|
|
[60, 61], [60, 62] ], |
|
692
|
|
|
|
|
|
|
Faces => [ [1, 2, 4], [2, 3, 4], [2, 20, 10], |
|
693
|
|
|
|
|
|
|
[2, 10, 11], [2, 11, 3], [3, 11, 12], |
|
694
|
|
|
|
|
|
|
[3, 12, 4], [20, 26, 27], [20, 27, 10], |
|
695
|
|
|
|
|
|
|
[10, 27, 11], [11, 27, 21], [11, 21, 12], |
|
696
|
|
|
|
|
|
|
[21, 27, 28], [12, 21, 28], [12, 28, 29], |
|
697
|
|
|
|
|
|
|
[1, 4, 6], [4, 12, 5], [4, 5, 6], |
|
698
|
|
|
|
|
|
|
[5, 12, 13], [5, 13, 6], [6, 13, 14], |
|
699
|
|
|
|
|
|
|
[6, 14, 23], [12, 29, 30], [12, 30, 22], |
|
700
|
|
|
|
|
|
|
[12, 22, 13], [13, 22, 31], [22, 30, 31], |
|
701
|
|
|
|
|
|
|
[13, 31, 14], [14, 31, 23], [23, 31, 32], |
|
702
|
|
|
|
|
|
|
[1, 6, 8], [6, 23, 15], [6, 15, 16], |
|
703
|
|
|
|
|
|
|
[6, 16, 7], [6, 7, 8], [8, 7, 17], |
|
704
|
|
|
|
|
|
|
[7, 16, 17], [23, 32, 33], [15, 23, 33], |
|
705
|
|
|
|
|
|
|
[16, 15, 33], [24, 16, 33], [34, 24, 33], |
|
706
|
|
|
|
|
|
|
[17, 16, 24], [17, 24, 34], [17, 34, 35], |
|
707
|
|
|
|
|
|
|
[1, 8, 2], [8, 17, 9], [8, 9, 2], |
|
708
|
|
|
|
|
|
|
[9, 17, 18], [9, 18, 2], [2, 18, 19], |
|
709
|
|
|
|
|
|
|
[2, 19, 20], [17, 35, 36], [17, 36, 25], |
|
710
|
|
|
|
|
|
|
[17, 25, 18], [18, 25, 37], [25, 36, 37], |
|
711
|
|
|
|
|
|
|
[19, 18, 37], [20, 19, 37], [20, 37, 26], |
|
712
|
|
|
|
|
|
|
[27, 26, 38], [27, 38, 44], [27, 44, 45], |
|
713
|
|
|
|
|
|
|
[27, 45, 39], [27, 39, 28], [28, 39, 46], |
|
714
|
|
|
|
|
|
|
[28, 46, 29], [39, 45, 46], [38, 54, 44], |
|
715
|
|
|
|
|
|
|
[55, 45, 54], [45, 44, 54], [45, 55, 46], |
|
716
|
|
|
|
|
|
|
[46, 55, 56], [55, 54, 56], [56, 54, 62], |
|
717
|
|
|
|
|
|
|
[30, 29, 46], [30, 46, 40], [31, 30, 40], |
|
718
|
|
|
|
|
|
|
[40, 46, 47], [31, 40, 47], [31, 47, 48], |
|
719
|
|
|
|
|
|
|
[31, 48, 41], [31, 41, 32], [46, 56, 57], |
|
720
|
|
|
|
|
|
|
[47, 46, 57], [47, 57, 58], [48, 47, 58], |
|
721
|
|
|
|
|
|
|
[41, 48, 58], [57, 56, 58], [58, 56, 62], |
|
722
|
|
|
|
|
|
|
[33, 32, 41], [33, 41, 49], [33, 49, 50], |
|
723
|
|
|
|
|
|
|
[33, 50, 42], [33, 42, 34], [34, 42, 51], |
|
724
|
|
|
|
|
|
|
[42, 50, 51], [35, 34, 51], [49, 41, 58], |
|
725
|
|
|
|
|
|
|
[50, 49, 58], [50, 58, 59], [51, 50, 59], |
|
726
|
|
|
|
|
|
|
[51, 59, 60], [59, 58, 60], [60, 58, 62], |
|
727
|
|
|
|
|
|
|
[36, 35, 51], [36, 51, 43], [37, 36, 43], |
|
728
|
|
|
|
|
|
|
[43, 51, 52], [37, 43, 52], [37, 52, 53], |
|
729
|
|
|
|
|
|
|
[37, 53, 38], [37, 38, 26], [51, 60, 61], |
|
730
|
|
|
|
|
|
|
[52, 51, 61], [52, 61, 54], [53, 52, 54], |
|
731
|
|
|
|
|
|
|
[38, 53, 54], [54, 61, 60], [54, 60, 62] ] } ]; |
|
732
|
|
|
|
|
|
|
|
|
733
|
|
|
|
|
|
|
#---------------------------------------------------------------------------- |
|
734
|
|
|
|
|
|
|
|
|
735
|
|
|
|
|
|
|
# A map from sides or name to the right structure. |
|
736
|
|
|
|
|
|
|
# |
|
737
|
|
|
|
|
|
|
my $Tris = |
|
738
|
|
|
|
|
|
|
{ |
|
739
|
|
|
|
|
|
|
120 => $Hexicosahedron, 'hexicosa' => $Hexicosahedron, |
|
740
|
|
|
|
|
|
|
20 => $Icosahedron, 'icosa' => $Icosahedron, |
|
741
|
|
|
|
|
|
|
12 => $Dodecahedron, 'dodeca' => $Dodecahedron, |
|
742
|
|
|
|
|
|
|
8 => $Octahedra, 'octa' => $Octahedra, |
|
743
|
|
|
|
|
|
|
6 => $Sexahedra, 'cube' => $Sexahedra, |
|
744
|
|
|
|
|
|
|
'hexa' => $Sexahedra, |
|
745
|
|
|
|
|
|
|
'sexa' => $Sexahedra, |
|
746
|
|
|
|
|
|
|
4 => $Tetrahedra, 'tetra' => $Tetrahedra, |
|
747
|
|
|
|
|
|
|
}; |
|
748
|
|
|
|
|
|
|
|
|
749
|
|
|
|
|
|
|
my $Rhombics = |
|
750
|
|
|
|
|
|
|
{ |
|
751
|
|
|
|
|
|
|
-30 => $RhombicTriacontahedron, 'triaconta' => $RhombicTriacontahedron, |
|
752
|
|
|
|
|
|
|
-12 => $RhombicDodecahedra, 'dodeca' => $RhombicDodecahedra, |
|
753
|
|
|
|
|
|
|
-6 => $Sexahedra, 'cube' => $Sexahedra, |
|
754
|
|
|
|
|
|
|
'hexa' => $Sexahedra, |
|
755
|
|
|
|
|
|
|
'sexa' => $Sexahedra, |
|
756
|
|
|
|
|
|
|
}; |
|
757
|
|
|
|
|
|
|
|
|
758
|
|
|
|
|
|
|
#---------------------------------------------------------------------------- |
|
759
|
|
|
|
|
|
|
|
|
760
|
|
|
|
|
|
|
=head2 polyhedra(), polyhedron() |
|
761
|
|
|
|
|
|
|
|
|
762
|
|
|
|
|
|
|
Retrieves a reference to a polyhedron structure by its name or the number |
|
763
|
|
|
|
|
|
|
of sides. This is a read-only structure which defines all of the vertex, |
|
764
|
|
|
|
|
|
|
edge and face information for the given polyhedron figure. |
|
765
|
|
|
|
|
|
|
|
|
766
|
|
|
|
|
|
|
The argument should either be a number, or a name. For example, |
|
767
|
|
|
|
|
|
|
C and C and C
|
|
768
|
|
|
|
|
|
|
hexahedron')> are all equivalent methods to retrieve the structure |
|
769
|
|
|
|
|
|
|
representing regular six-sided cubical figures. |
|
770
|
|
|
|
|
|
|
|
|
771
|
|
|
|
|
|
|
my $cube = polyhedron(6); # regular six-sided figure |
|
772
|
|
|
|
|
|
|
my $ico = polyhedron(20); # icosahedron has 20 triangular faces |
|
773
|
|
|
|
|
|
|
my $rhombdod = polyhedron($_ = 'rhombic dodecahedron'); |
|
774
|
|
|
|
|
|
|
print 'Found ', scalar @$ico, ' variations of ', $_, $/; |
|
775
|
|
|
|
|
|
|
|
|
776
|
|
|
|
|
|
|
The values inside the reference should not be modified as they are not |
|
777
|
|
|
|
|
|
|
recalculated on each subsequent call. The scalar reference is intended |
|
778
|
|
|
|
|
|
|
to be given as an argument to the C, C, C, |
|
779
|
|
|
|
|
|
|
or C functions in this module. |
|
780
|
|
|
|
|
|
|
|
|
781
|
|
|
|
|
|
|
The set of known names and their faces are as follows: |
|
782
|
|
|
|
|
|
|
|
|
783
|
|
|
|
|
|
|
=over 4 |
|
784
|
|
|
|
|
|
|
|
|
785
|
|
|
|
|
|
|
=item * |
|
786
|
|
|
|
|
|
|
|
|
787
|
|
|
|
|
|
|
tetrahedron (4 triangular faces) [10 variations] |
|
788
|
|
|
|
|
|
|
|
|
789
|
|
|
|
|
|
|
=item * |
|
790
|
|
|
|
|
|
|
|
|
791
|
|
|
|
|
|
|
cube, hexahedron (6 square faces) (+6) (-6) [5 variations] |
|
792
|
|
|
|
|
|
|
|
|
793
|
|
|
|
|
|
|
=item * |
|
794
|
|
|
|
|
|
|
|
|
795
|
|
|
|
|
|
|
octahedron (8 triangular faces) [5 variations] |
|
796
|
|
|
|
|
|
|
|
|
797
|
|
|
|
|
|
|
=item * |
|
798
|
|
|
|
|
|
|
|
|
799
|
|
|
|
|
|
|
dodecahedron (12 pentagonic faces) |
|
800
|
|
|
|
|
|
|
|
|
801
|
|
|
|
|
|
|
=item * |
|
802
|
|
|
|
|
|
|
|
|
803
|
|
|
|
|
|
|
rhombic dodecahedron (12 diamond faces) (-12) [5 variations] |
|
804
|
|
|
|
|
|
|
|
|
805
|
|
|
|
|
|
|
=item * |
|
806
|
|
|
|
|
|
|
|
|
807
|
|
|
|
|
|
|
icosahedron (20 triangular faces) |
|
808
|
|
|
|
|
|
|
|
|
809
|
|
|
|
|
|
|
=item * |
|
810
|
|
|
|
|
|
|
|
|
811
|
|
|
|
|
|
|
rhombic triacontahedron (30 diamond faces) (-30) |
|
812
|
|
|
|
|
|
|
|
|
813
|
|
|
|
|
|
|
=item * |
|
814
|
|
|
|
|
|
|
|
|
815
|
|
|
|
|
|
|
hexicosahedron (120 irregular triangular faces) |
|
816
|
|
|
|
|
|
|
|
|
817
|
|
|
|
|
|
|
=back |
|
818
|
|
|
|
|
|
|
|
|
819
|
|
|
|
|
|
|
Other polyhedra such as the decahedron, a common rhombic ten-sided |
|
820
|
|
|
|
|
|
|
figure, cannot be constructed solely using the value of I, and are |
|
821
|
|
|
|
|
|
|
not currently supported by this module. The name 'hexicosahedron' may be |
|
822
|
|
|
|
|
|
|
apocryphal, since it's not a regular shape with 120 regular sides, but is |
|
823
|
|
|
|
|
|
|
instead comprised of various unions of the other volumes presented. |
|
824
|
|
|
|
|
|
|
|
|
825
|
|
|
|
|
|
|
For a given polyhedron structure, more than one variation of the |
|
826
|
|
|
|
|
|
|
structure may be known. There are ten different C<'tetrahedra'> defined |
|
827
|
|
|
|
|
|
|
by the 62 I point library, for example. The expression C<(scalar |
|
828
|
|
|
|
|
|
|
@$hedron)> for a given structure will return how many variations are |
|
829
|
|
|
|
|
|
|
defined, and C<< ($hedron->[3]) >> will select that specific variety for the |
|
830
|
|
|
|
|
|
|
other functions. These variations are not different in shape, but merely |
|
831
|
|
|
|
|
|
|
in differing orientations relative to the origin. Most applications |
|
832
|
|
|
|
|
|
|
don't need this information, but some studies of the S may |
|
833
|
|
|
|
|
|
|
select from these variations. |
|
834
|
|
|
|
|
|
|
|
|
835
|
|
|
|
|
|
|
The C function is just a convenient alias for the preferred |
|
836
|
|
|
|
|
|
|
name, C. |
|
837
|
|
|
|
|
|
|
|
|
838
|
|
|
|
|
|
|
=cut |
|
839
|
|
|
|
|
|
|
|
|
840
|
0
|
|
|
0
|
1
|
0
|
sub polyhedra { polyhedron(@_) } |
|
841
|
|
|
|
|
|
|
|
|
842
|
|
|
|
|
|
|
sub polyhedron |
|
843
|
|
|
|
|
|
|
{ |
|
844
|
8
|
|
|
8
|
1
|
8319
|
my $sides = shift; |
|
845
|
8
|
|
|
|
|
28
|
$sides = lc($sides); |
|
846
|
8
|
|
|
|
|
54
|
$sides =~ s/hedron|hedra//; |
|
847
|
8
|
100
|
66
|
|
|
104
|
my $set = (($sides =~ s/rhomb//) || (0 > $sides))? $Rhombics : $Tris; |
|
848
|
8
|
50
|
|
|
|
27
|
return undef if not $set; |
|
849
|
8
|
100
|
|
|
|
57
|
return $set->{$sides} if $set->{$sides}; |
|
850
|
2
|
100
|
|
|
|
11
|
for (keys %$set) { return $set->{$_} if $sides =~ m/$_/ } |
|
|
9
|
|
|
|
|
101
|
|
|
851
|
0
|
|
|
|
|
0
|
return undef; |
|
852
|
|
|
|
|
|
|
} |
|
853
|
|
|
|
|
|
|
|
|
854
|
|
|
|
|
|
|
=head2 vertices() |
|
855
|
|
|
|
|
|
|
|
|
856
|
|
|
|
|
|
|
my $verts = vertices($cube); |
|
857
|
|
|
|
|
|
|
while (@$verts) |
|
858
|
|
|
|
|
|
|
{ draw_dot(shift @$verts); } |
|
859
|
|
|
|
|
|
|
|
|
860
|
|
|
|
|
|
|
Returns a list reference, containing one vector for each vertex in the |
|
861
|
|
|
|
|
|
|
polyhedron. Each vertex is itself a list reference of real coordinate |
|
862
|
|
|
|
|
|
|
values, such as this C< [ $x, $y, $z ] > triple. |
|
863
|
|
|
|
|
|
|
|
|
864
|
|
|
|
|
|
|
=cut |
|
865
|
|
|
|
|
|
|
|
|
866
|
|
|
|
|
|
|
sub vertices |
|
867
|
|
|
|
|
|
|
{ |
|
868
|
8
|
|
|
8
|
1
|
6599
|
my $hedron = shift; |
|
869
|
8
|
50
|
|
|
|
37
|
$hedron = $hedron->[0] if "ARRAY" eq ref $hedron; |
|
870
|
8
|
|
|
|
|
21
|
my $coords = coordinates(@_); |
|
871
|
8
|
|
|
|
|
13
|
my @v = @{$hedron->{Verts}}; |
|
|
8
|
|
|
|
|
55
|
|
|
872
|
8
|
|
|
|
|
17
|
@v = map { $coords->[$_] } @v; |
|
|
158
|
|
|
|
|
254
|
|
|
873
|
8
|
|
|
|
|
35
|
return \@v; |
|
874
|
|
|
|
|
|
|
} |
|
875
|
|
|
|
|
|
|
|
|
876
|
|
|
|
|
|
|
=head2 edges() |
|
877
|
|
|
|
|
|
|
|
|
878
|
|
|
|
|
|
|
my $edges = edges($cube); |
|
879
|
|
|
|
|
|
|
while (@$edges) |
|
880
|
|
|
|
|
|
|
{ move_to(shift @$edges); |
|
881
|
|
|
|
|
|
|
draw_to(shift @$edges); |
|
882
|
|
|
|
|
|
|
} |
|
883
|
|
|
|
|
|
|
|
|
884
|
|
|
|
|
|
|
Returns a list reference, which contains two vectors defining each edge |
|
885
|
|
|
|
|
|
|
of the polyhedra. Each pair is an independent edge; the first edge is |
|
886
|
|
|
|
|
|
|
the vectors indexed 0 and 1, then index 2 to index 3, and so on. (This |
|
887
|
|
|
|
|
|
|
is not an optimized "line strip.") The vector references will be |
|
888
|
|
|
|
|
|
|
repeated as required. |
|
889
|
|
|
|
|
|
|
|
|
890
|
|
|
|
|
|
|
=cut |
|
891
|
|
|
|
|
|
|
|
|
892
|
|
|
|
|
|
|
sub edges |
|
893
|
|
|
|
|
|
|
{ |
|
894
|
8
|
|
|
8
|
1
|
9968
|
my $hedron = shift; |
|
895
|
8
|
50
|
|
|
|
39
|
$hedron = $hedron->[0] if "ARRAY" eq ref $hedron; |
|
896
|
8
|
|
|
|
|
20
|
my $coords = coordinates(@_); |
|
897
|
8
|
|
|
|
|
13
|
my @e = @{$hedron->{Edges}}; |
|
|
8
|
|
|
|
|
100
|
|
|
898
|
8
|
|
|
|
|
20
|
@e = map { $coords->[$_->[0]], $coords->[$_->[1]] } @e; |
|
|
353
|
|
|
|
|
725
|
|
|
899
|
8
|
|
|
|
|
63
|
return \@e; |
|
900
|
|
|
|
|
|
|
} |
|
901
|
|
|
|
|
|
|
|
|
902
|
|
|
|
|
|
|
=head2 faces() |
|
903
|
|
|
|
|
|
|
|
|
904
|
|
|
|
|
|
|
Returns a list reference, which contains sublists of at least three |
|
905
|
|
|
|
|
|
|
coplanar vectors defining each face. Each list is an independent |
|
906
|
|
|
|
|
|
|
face. The vector references will be repeated as required. |
|
907
|
|
|
|
|
|
|
|
|
908
|
|
|
|
|
|
|
The vertices in each face are not sorted or ordered around the |
|
909
|
|
|
|
|
|
|
circumference of the face. Typically, graphics programs should use the |
|
910
|
|
|
|
|
|
|
C or C for ordering information. |
|
911
|
|
|
|
|
|
|
|
|
912
|
|
|
|
|
|
|
=cut |
|
913
|
|
|
|
|
|
|
|
|
914
|
|
|
|
|
|
|
sub faces |
|
915
|
|
|
|
|
|
|
{ |
|
916
|
8
|
|
|
8
|
1
|
3406
|
my $hedron = shift; |
|
917
|
8
|
50
|
|
|
|
39
|
$hedron = $hedron->[0] if "ARRAY" eq ref $hedron; |
|
918
|
8
|
|
|
|
|
25
|
my $coords = coordinates(@_); |
|
919
|
|
|
|
|
|
|
|
|
920
|
8
|
|
|
|
|
19
|
my @e = @{$hedron->{Faces}}; |
|
|
8
|
|
|
|
|
78
|
|
|
921
|
|
|
|
|
|
|
|
|
922
|
|
|
|
|
|
|
# multiple tris per face |
|
923
|
|
|
|
|
|
|
# @e = ( [ [ v v v ] [ v v v ] ] |
|
924
|
|
|
|
|
|
|
# [ [ v v v ] [ v v v ] ] ... ) |
|
925
|
8
|
100
|
66
|
|
|
69
|
if (ref($e[0]) and |
|
926
|
|
|
|
|
|
|
ref($e[0][0])) |
|
927
|
|
|
|
|
|
|
{ |
|
928
|
4
|
|
|
|
|
8
|
my @ee = (); |
|
929
|
4
|
|
|
|
|
9
|
foreach my $f (@e) |
|
930
|
|
|
|
|
|
|
{ |
|
931
|
60
|
|
|
|
|
78
|
my %u = (); |
|
932
|
60
|
|
|
|
|
84
|
foreach my $t (@$f) |
|
933
|
132
|
|
|
|
|
662
|
{ @u{@$t} = (@$t); } |
|
934
|
60
|
|
|
|
|
117
|
push(@ee, [ map { $coords->[$_] } values %u ]); |
|
|
252
|
|
|
|
|
520
|
|
|
935
|
|
|
|
|
|
|
} |
|
936
|
4
|
|
|
|
|
19
|
return \@ee; |
|
937
|
|
|
|
|
|
|
} |
|
938
|
|
|
|
|
|
|
|
|
939
|
|
|
|
|
|
|
# single tris per face |
|
940
|
|
|
|
|
|
|
# @e = ( [ v v v ] |
|
941
|
|
|
|
|
|
|
# [ v v v ] ... ) |
|
942
|
|
|
|
|
|
|
# |
|
943
|
4
|
|
|
|
|
10
|
@e = map { [ $coords->[$_->[0]], |
|
|
152
|
|
|
|
|
415
|
|
|
944
|
|
|
|
|
|
|
$coords->[$_->[1]], |
|
945
|
|
|
|
|
|
|
$coords->[$_->[2]] ] } @e; |
|
946
|
|
|
|
|
|
|
|
|
947
|
4
|
|
|
|
|
20
|
return \@e; |
|
948
|
|
|
|
|
|
|
} |
|
949
|
|
|
|
|
|
|
|
|
950
|
|
|
|
|
|
|
=head2 tris() |
|
951
|
|
|
|
|
|
|
|
|
952
|
|
|
|
|
|
|
my $tris = tris($cube); |
|
953
|
|
|
|
|
|
|
while (@$tris) |
|
954
|
|
|
|
|
|
|
{ first_vertex(shift @$tris); |
|
955
|
|
|
|
|
|
|
second_vertex(shift @$tris), |
|
956
|
|
|
|
|
|
|
third_vertex(shift @$tris); |
|
957
|
|
|
|
|
|
|
} |
|
958
|
|
|
|
|
|
|
|
|
959
|
|
|
|
|
|
|
Returns a list reference, which contains three [ X, Y, Z ] coordinate |
|
960
|
|
|
|
|
|
|
triples for each triangle in sublists. Each triple is an independent |
|
961
|
|
|
|
|
|
|
triangle; the first triangle is between vectors 0, 1, 2, then another |
|
962
|
|
|
|
|
|
|
triangle between vectors 3, 4, 5, and so on. (This is not an optimized |
|
963
|
|
|
|
|
|
|
"triangle strip.") The vector references will be repeated as required. |
|
964
|
|
|
|
|
|
|
|
|
965
|
|
|
|
|
|
|
All of the triangles returned are defined in clockwise order, such that |
|
966
|
|
|
|
|
|
|
the implied normals (B-A)x(C-A) are facing "outward," away from the |
|
967
|
|
|
|
|
|
|
origin. Many graphics applications require consistent definition to |
|
968
|
|
|
|
|
|
|
calculate proper outward-facing normals for lighting or culling. |
|
969
|
|
|
|
|
|
|
|
|
970
|
|
|
|
|
|
|
=cut |
|
971
|
|
|
|
|
|
|
|
|
972
|
|
|
|
|
|
|
sub tris |
|
973
|
|
|
|
|
|
|
{ |
|
974
|
8
|
|
|
8
|
1
|
6311
|
my $hedron = shift; |
|
975
|
8
|
50
|
|
|
|
41
|
$hedron = $hedron->[0] if "ARRAY" eq ref $hedron; |
|
976
|
8
|
|
|
|
|
19
|
my $coords = coordinates(@_); |
|
977
|
8
|
|
|
|
|
16
|
my @e = @{$hedron->{Faces}}; |
|
|
8
|
|
|
|
|
59
|
|
|
978
|
|
|
|
|
|
|
|
|
979
|
|
|
|
|
|
|
# multiple tris per face |
|
980
|
|
|
|
|
|
|
# @e = ( [ [ v v v ] [ v v v ] ] |
|
981
|
|
|
|
|
|
|
# [ [ v v v ] [ v v v ] ] ... ) |
|
982
|
8
|
100
|
66
|
|
|
67
|
if (ref($e[0]) and |
|
983
|
|
|
|
|
|
|
ref($e[0][0])) |
|
984
|
|
|
|
|
|
|
{ |
|
985
|
4
|
|
|
|
|
9
|
@e = map { @$_ } @e; |
|
|
60
|
|
|
|
|
122
|
|
|
986
|
|
|
|
|
|
|
} |
|
987
|
|
|
|
|
|
|
|
|
988
|
|
|
|
|
|
|
# single tris per face |
|
989
|
|
|
|
|
|
|
# @e = ( [ v v v ] |
|
990
|
|
|
|
|
|
|
# [ v v v ] ... ) |
|
991
|
|
|
|
|
|
|
# |
|
992
|
8
|
|
|
|
|
64
|
@e = map { $coords->[$_->[0]], |
|
|
284
|
|
|
|
|
688
|
|
|
993
|
|
|
|
|
|
|
$coords->[$_->[1]], |
|
994
|
|
|
|
|
|
|
$coords->[$_->[2]] } @e; |
|
995
|
|
|
|
|
|
|
|
|
996
|
8
|
|
|
|
|
73
|
return \@e; |
|
997
|
|
|
|
|
|
|
} |
|
998
|
|
|
|
|
|
|
|
|
999
|
|
|
|
|
|
|
1; |
|
1000
|
|
|
|
|
|
|
__END__ |