File: solids.rules

package info (click to toggle)
polymake 4.3-4
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 31,528 kB
  • sloc: cpp: 152,204; perl: 43,222; javascript: 30,700; ansic: 2,937; java: 2,654; python: 641; sh: 244; xml: 117; makefile: 62
file content (245 lines) | stat: -rw-r--r-- 13,884 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
#  Copyright (c) 1997-2020
#  Ewgenij Gawrilow, Michael Joswig, and the polymake team
#  Technische Universität Berlin, Germany
#  https://polymake.org
#
#  This program is free software; you can redistribute it and/or modify it
#  under the terms of the GNU General Public License as published by the
#  Free Software Foundation; either version 2, or (at your option) any
#  later version: http://www.gnu.org/licenses/gpl.txt.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.
#-------------------------------------------------------------------------------


# @category Producing regular polytopes and their generalizations
# Create Platonic solid of the given name.
# @param String s the name of the desired Platonic solid
# @value s 'tetrahedron' Tetrahedron.
#          Regular polytope with four triangular facets.
# @value s 'cube' Cube.
#          Regular polytope with six square facets.
# @value s 'octahedron' Octahedron.
#          Regular polytope with eight triangular facets.
# @value s 'dodecahedron' Dodecahedron.
#          Regular polytope with 12 pentagonal facets.
# @value s 'icosahedron' Icosahedron.
#          Regular polytope with 20 triangular facets.
# @return Polytope

user_function platonic_solid(String){
	my $name = shift;
	if ($name eq "tetrahedron"){ return tetrahedron<QuadraticExtension>(); }
	if ($name eq "cube"){ return cube<QuadraticExtension>(3); }
	if ($name eq "octahedron"){ return cross<QuadraticExtension>(3); }
	if ($name eq "icosahedron"){ return icosahedron(); }
	if ($name eq "dodecahedron"){ return dodecahedron(); }
	else{ die "No Platonic solid of given name found."; }
}

# @category Producing regular polytopes and their generalizations
# Create Archimedean solid of the given name.
# Some polytopes are realized with floating point numbers and thus not exact;
# Vertex-facet-incidences are correct in all cases.
# @param String s the name of the desired Archimedean solid
# @value s 'truncated_tetrahedron' Truncated tetrahedron.
#          Regular polytope with four triangular and four hexagonal facets.
# @value s 'cuboctahedron' Cuboctahedron.
#          Regular polytope with eight triangular and six square facets.
# @value s 'truncated_cube' Truncated cube.
#          Regular polytope with eight triangular and six octagonal facets.
# @value s 'truncated_octahedron' Truncated Octahedron.
#          Regular polytope with six square and eight hexagonal facets.
# @value s 'rhombicuboctahedron' Rhombicuboctahedron.
#          Regular polytope with eight triangular and 18 square facets.
# @value s 'truncated_cuboctahedron' Truncated Cuboctahedron.
#          Regular polytope with 12 square, eight hexagonal and six octagonal facets.
# @value s 'snub_cube' Snub Cube.
#          Regular polytope with 32 triangular and six square facets.
#          The vertices are realized as floating point numbers.
#          This is a chiral polytope.
# @value s 'icosidodecahedron' Icosidodecahedon.
#          Regular polytope with 20 triangular and 12 pentagonal facets.
# @value s 'truncated_dodecahedron' Truncated Dodecahedron.
#          Regular polytope with 20 triangular and 12 decagonal facets.
# @value s 'truncated_icosahedron' Truncated Icosahedron.
#          Regular polytope with 12 pentagonal and 20 hexagonal facets.
# @value s 'rhombicosidodecahedron' Rhombicosidodecahedron.
#          Regular polytope with 20 triangular, 30 square and 12 pentagonal facets.
# @value s 'truncated_icosidodecahedron' Truncated Icosidodecahedron.
#          Regular polytope with 30 square, 20 hexagonal and 12 decagonal facets.
# @value s 'snub_dodecahedron' Snub Dodecahedron.
#          Regular polytope with 80 triangular and 12 pentagonal facets.
#          The vertices are realized as floating point numbers.
#          This is a chiral polytope.
# @return Polytope
# @example To show the mirror image of the snub cube use:
# > scale(archimedean_solid('snub_cube'),-1)->VISUAL;

user_function archimedean_solid(String){
	my $name = shift;
	if ($name eq "truncated_tetrahedron"){ return truncation(tetrahedron(),All,cutoff=>2/3); }
	if ($name eq "cuboctahedron"){ return cuboctahedron(); }
	if ($name eq "truncated_cube"){ return truncated_cube(); }
	if ($name eq "truncated_octahedron"){ return truncated_octahedron(); }
	if ($name eq "snub_cube"){
		# coordinates from wikipedia
		my $M = new Matrix(0,3);
		my $t = (1 + (19-3*sqrt(33))**(1/3.) + (19+3*sqrt(33))**(1/3.))/3; #FIXME: #830 - cube root in tribonacci constant is inexact
		my $N_even = new Matrix([[-1,1/$t,$t],[1,-1/$t,$t],[1,1/$t,-$t],[-1,-1/$t,-$t]]);
		my $N_odd = new Matrix([[-1,-1/$t,$t],[1,-1/$t,-$t],[-1,1/$t,-$t],[1,1/$t,$t]]);
		foreach (@{all_permutations(3)}) {
			my $P = permutation_matrix($_);
			if(permutation_sign($_)==1){
				$M = $M / ($N_even * $P);
			}else{
				$M = $M / ($N_odd * $P);
			}
		}
		$M = ones_vector($M->rows) | $M;
		my $VIF = new IncidenceMatrix(
			[16,17,20,23],[18,19,21,22],[10,11,13,14],[8,9,12,15],
			[6,13,20],[3,19,22],[12,18,22],[0,18,21],
			[3,11,19],[3,5,22],[11,14,19],[4,14,21],
			[0,9,18],[0,4,21],[5,12,22],[0,1,4,7],
			[3,6,11],[4,10,14],[5,8,12],[1,4,10],
			[9,12,18],[7,9,15],[0,7,9],[2,5,8],
			[2,3,5,6],[6,11,13],[10,13,16],[14,19,21],
			[7,15,23],[1,10,16],[2,6,20],[13,16,20],
			[1,7,23],[1,16,23],[8,15,17],[2,17,20],
			[15,17,23],[2,8,17]);
		my $P = new Polytope<Float>(VERTICES=>$M, VERTICES_IN_FACETS=>$VIF);
		$P->description = "Snub cube. An Archimedean solid.";
		return $P;
	}
	if ($name eq "rhombicuboctahedron"){ return rhombicuboctahedron(); }
	if ($name eq "truncated_cuboctahedron"){ return truncated_cuboctahedron(); }
	if ($name eq "icosidodecahedron"){ return icosidodecahedron(); }
	if ($name eq "truncated_dodecahedron"){ return truncated_dodecahedron(); }
	if ($name eq "truncated_icosahedron"){ return truncated_icosahedron(); }
	if ($name eq "rhombicosidodecahedron"){ return rhombicosidodecahedron(); }
	if ($name eq "truncated_icosidodecahedron"){ return truncated_icosidodecahedron(); }
	if ($name eq "snub_dodecahedron"){
		#coordinates from wikipedia
		my $M = new Matrix(0,3);
		my $phi = (1+sqrt(5))/2;
		my $cet = (($phi + sqrt($phi-5/27.))/2)**(1/3.) + (($phi - sqrt($phi-5/27.))/2)**(1/3.); #FIXME: #830 - cube root is inexact
		my $a = $cet - 1/$cet;
		my $b = $cet*$phi + $phi**2 + $phi/$cet;
		my $N = new Matrix([
			[-2*$a,-2,-2*$b],[-2*$a,2,2*$b],[2*$a,-2,2*$b],[2*$a,2,-2*$b],
			[-($a+$b/$phi+$phi),-(-$a*$phi+$b+1/$phi),-($a/$phi+$b*$phi-1)],
			[-($a+$b/$phi+$phi),(-$a*$phi+$b+1/$phi),($a/$phi+$b*$phi-1)],
			[($a+$b/$phi+$phi),-(-$a*$phi+$b+1/$phi),($a/$phi+$b*$phi-1)],
			[($a+$b/$phi+$phi),(-$a*$phi+$b+1/$phi),-($a/$phi+$b*$phi-1)],
			[-($a+$b/$phi-$phi),-($a*$phi-$b+1/$phi),-($a/$phi+$b*$phi+1)],
			[-($a+$b/$phi-$phi),($a*$phi-$b+1/$phi),($a/$phi+$b*$phi+1)],
			[($a+$b/$phi-$phi),-($a*$phi-$b+1/$phi),($a/$phi+$b*$phi+1)],
			[($a+$b/$phi-$phi),($a*$phi-$b+1/$phi),-($a/$phi+$b*$phi+1)],
			[-(-$a/$phi+$b*$phi+1),-(-$a+$b/$phi-$phi),-($a*$phi+$b-1/$phi)],
			[-(-$a/$phi+$b*$phi+1),(-$a+$b/$phi-$phi),($a*$phi+$b-1/$phi)],
			[(-$a/$phi+$b*$phi+1),-(-$a+$b/$phi-$phi),($a*$phi+$b-1/$phi)],
			[(-$a/$phi+$b*$phi+1),(-$a+$b/$phi-$phi),-($a*$phi+$b-1/$phi)],
			[-(-$a/$phi+$b*$phi-1),-($a-$b/$phi-$phi),-($a*$phi+$b+1/$phi)],
			[-(-$a/$phi+$b*$phi-1),($a-$b/$phi-$phi),($a*$phi+$b+1/$phi)],
			[(-$a/$phi+$b*$phi-1),-($a-$b/$phi-$phi),($a*$phi+$b+1/$phi)],
			[(-$a/$phi+$b*$phi-1),($a-$b/$phi-$phi),-($a*$phi+$b+1/$phi)]
		]);
		foreach (@{all_permutations(3)}) {
			my $P = permutation_matrix($_);
			if(permutation_sign($_)==1){
				$M = $M / ($N * $P);
			}
		}
		$M = ones_vector($M->rows) | $M;
		my $VIF = new IncidenceMatrix([
			[1,5,9,13,17],[40,44,48,52,56],[0,4,8,12,16],[3,7,11,15,19],
			[42,46,50,54,58],[2,6,10,14,18],[23,27,31,35,39],[41,45,49,53,57],
			[22,26,30,34,38],[43,47,51,55,59],[21,25,29,33,37],[20,24,28,32,36],
			[40,43,51],[12,40,51],[17,48,56],[13,17,48],
			[12,16,51],[16,51,59],[4,12,44],[5,13,47],
			[17,39,56],[4,24,44],[24,44,52],[26,47,55],
			[16,37,59],[4,24,32],[5,26,47],[29,55,59],
			[31,39,56],[31,52,56],[1,5,34],[9,17,39],
			[5,26,34],[29,37,59],[22,29,55],[40,43,48],
			[1,10,34],[13,43,48],[8,16,37],[12,40,44],
			[13,43,47],[0,4,32],[20,24,52],[20,31,52],
			[22,26,55],[1,2,10],[21,22,29],[9,35,39],
			[10,34,38],[20,23,31],[0,11,32],[0,3,8],
			[20,23,28],[1,2,9],[8,33,37],[3,8,33],
			[2,9,35],[19,36,57],[0,3,11],[6,27,35],
			[11,32,36],[21,22,30],[23,27,53],[21,25,54],
			[3,7,33],[11,19,36],[21,30,54],[23,28,53],
			[6,14,45],[2,6,35],[30,54,58],[10,18,38],
			[27,45,53],[7,25,33],[30,38,58],[6,27,45],
			[28,36,57],[28,53,57],[18,38,58],[25,46,54],
			[19,49,57],[41,42,49],[7,25,46],[15,19,49],
			[14,41,45],[7,15,46],[15,42,46],[15,42,49],
			[14,41,50],[41,42,50],[18,50,58],[14,18,50]]);
		my $P = new Polytope<Float>(VERTICES=>$M, VERTICES_IN_FACETS=>$VIF);
		$P->description = "Snub dodecahedron. An Archimedean solid.";
		return $P;
	}
	else{ die "No Archimedean solid of given name found."; }
}

# @category Producing regular polytopes and their generalizations
# Create Catalan solid of the given name.
# Some polytopes are realized with floating point numbers and thus not exact;
# Vertex-facet-incidences are correct in all cases.
# @param String s the name of the desired Catalan solid
# @value s 'triakis_tetrahedron' Triakis Tetrahedron.
#          Dual polytope to the Truncated Tetrahedron, made of 12 isosceles triangular facets.
# @value s 'triakis_octahedron' Triakis Octahedron.
#          Dual polytope to the Truncated Cube, made of 24 isosceles triangular facets.
# @value s 'rhombic_dodecahedron' Rhombic dodecahedron.
#          Dual polytope to the cuboctahedron, made of 12 rhombic facets.
# @value s 'tetrakis_hexahedron' Tetrakis hexahedron.
#          Dual polytope to the truncated octahedron, made of 24 isosceles triangluar facets.
# @value s 'disdyakis_dodecahedron' Disdyakis dodecahedron.
#          Dual polytope to the truncated cuboctahedron, made of 48 scalene triangular facets.
# @value s 'pentagonal_icositetrahedron' Pentagonal Icositetrahedron.
#          Dual polytope to the snub cube, made of 24 irregular pentagonal facets.
#          The vertices are realized as floating point numbers.
# @value s 'pentagonal_hexecontahedron' Pentagonal Hexecontahedron.
#          Dual polytope to the snub dodecahedron, made of 60 irregular pentagonal facets.
#          The vertices are realized as floating point numbers.
# @value s 'rhombic_triacontahedron' Rhombic triacontahedron.
#          Dual polytope to the icosidodecahedron, made of 30 rhombic facets.
# @value s 'triakis_icosahedron' Triakis icosahedron.
#          Dual polytope to the icosidodecahedron, made of 30 rhombic facets.
# @value s 'deltoidal_icositetrahedron' Deltoidal Icositetrahedron.
#          Dual polytope to the rhombicubaoctahedron, made of 24 kite facets.
# @value s 'pentakis_dodecahedron' Pentakis dodecahedron.
#          Dual polytope to the truncated icosahedron, made of 60 isosceles triangular facets.
# @value s 'deltoidal_hexecontahedron' Deltoidal hexecontahedron.
#          Dual polytope to the rhombicosidodecahedron, made of 60 kite facets.
# @value s 'disdyakis_triacontahedron' Disdyakis triacontahedron.
#          Dual polytope to the truncated icosidodecahedron, made of 120 scalene triangular facets.
# @return Polytope

user_function catalan_solid(String){
my $name = shift;
	if ($name eq "triakis_tetrahedron"){ my $p = polarize(archimedean_solid('truncated_tetrahedron')); $p->description = "Triakis Tetrahedron. A Catalan solid."; return $p; }
	if ($name eq "triakis_octahedron"){ my $p = polarize(archimedean_solid('truncated_cube')); $p->description = "Triakis Octahedron. A Catalan solid."; return $p; }
	if ($name eq "rhombic_dodecahedron"){ my $p = polarize(cuboctahedron()); $p->description = "Rhombic dodecahedron. A Catalan solid."; return $p;}
	if ($name eq "tetrakis_hexahedron"){ my $p = polarize(truncated_octahedron()); $p->description = "Tetrakis Hexahedron . A Catalan solid."; return $p; }
	if ($name eq "disdyakis_dodecahedron"){ my $p = polarize(truncated_cuboctahedron()); $p->description = "Disdyakis dodecahedron. A Catalan solid."; return $p; }
	if ($name eq "pentagonal_icositetrahedron"){ my $p = polarize(archimedean_solid('snub_cube')); $p->description = "Pentagonal Icositetrahedron. A Catalan solid."; return $p; }
	if ($name eq "pentagonal_hexecontahedron"){ my $p = polarize(archimedean_solid('snub_dodecahedron')); $p->description = "Pentagonal Hexecontahedron. A Catalan solid."; return $p; }
	if ($name eq "rhombic_triacontahedron"){ my $p = polarize(icosidodecahedron()); $p->description = "Rhombic triacontahedron. A Catalan solid."; return $p; }
	if ($name eq "triakis_icosahedron"){ my $p = polarize(truncated_dodecahedron()); $p->description = "Triakis icosahedron. A Catalan solid."; return $p; }
	if ($name eq "deltoidal_icositetrahedron"){ my $p = polarize(rhombicuboctahedron()); $p->description = "Deltoidal icositetrahedron. A Catalan solid."; return $p; }
	if ($name eq "pentakis_dodecahedron"){ my $p = polarize(truncated_icosahedron()); $p->description = "Pentakis dodecahedron. A Catalan solid."; return $p; }
	if ($name eq "deltoidal_hexecontahedron"){ my $p = polarize(rhombicosidodecahedron()); $p->description = "Deltoidal hexecontahedron. A Catalan solid."; return $p; }
	if ($name eq "disdyakis_triacontahedron"){ my $p = polarize(truncated_icosidodecahedron()); $p->description = "Disdyakis triacontahedron. A Catalan solid."; return $p; }
	else{ die "No Catalan solid of given name found."; }
}

# Local Variables:
# mode: perl
# c-basic-offset:3
# End: