Of the 230 space groups, the symmetries possible in a crystal lattice, the most complicated is group 214, 32. In the words of Steve Dutch, “This group looks chaotic, but visualizing it is easy. All you do is sit there until little beads of blood form on your forehead.” In 1980, P. Engel used this group to make a 38-sided space-filling polyhedron. In 2016, Moritz Schmitt did a complete study of lattice-based space-filling polyhedra, and the Engel-38 had more faces than anything else: Schmitt, Moritz W. (2016), On Space Groups and Dirichlet-Voronoi Stereohedra, Refubium - Freie Universität Berlin Repository, http://dx.doi.org/10.17169/refubium-14374
I4
1
So, what does Engel-38 look like? Just use the symmetries of 32 with the following generator point and find the Voronoi cells. It’s that easy!
I4
1
In[]:=
generator={427/6984,761/6984,1421/6984};
I’ve been trying to figure out how to do that for years. But wait, we can get help from page 220 of Engel’s Geometric Crystallography. As a hint, we’re going for the third item. Actually, I found this image unhelpful for getting the 3D version, but YMMV.
So, to solve this, I used the tried and true method of giving up and asking for help: 38-sided space-filling polyhedron. After five years, Anders Kaseorg posted an answer with approximate coordinates. Turns out the Moritz Schmitt method worked. With those approximate answers, I was able to use various WL tricks to get exact coordinates. The resource functions IntegerChop (multiply by 6984) and ReflectPoints helped to create 38 midplanes.
Here are exact coordinates using that generator:
In[]:=
vv=,0,,,,,,,,-,,,-,,,-,,,-,,,-,-,-,-,-,-,,,,,,,-,,,,,,-,-,,-,-,,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,,,,-,-,-,,,,,,,,,,-,0,,-,,,-,,,-,,,-,,,-,,,-,,,-,,,-,,,-,,,-,,,-,,,,,,0,,,,,,,,,-,,,-,,,0,,,-,,,-,-,0,-,-,,-,-,,-,-,0,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,-,,,-,,,-,,,-,,,,,,,,,,,,,,,-,,,-,,,-,,,-,,,-,,;
1
8
1
4
107461
289836
136309
379464
9297209
23621634
107461
289836
221801821
629523792
252105773
629523792
12563675
71428504
1772963
10204072
38067937
71428504
17501
144918
94724825
629523792
379182769
629523792
1
8
325
2172
326
543
45941
398088
33581275
216161784
130304813
216161784
6783601
47243268
41443
379464
17501
144918
17501
144918
94724825
629523792
64420873
629523792
127275209
369977400
136309
379464
51839447
123325800
145463
398088
76264367
216161784
87621721
216161784
81713311
321051301
66661075
642102602
633230243
1284205204
1
8
2397
7880
4367
7880
2207001
8479108
829075
8479108
89233
4239554
81713311
321051301
66661075
642102602
8872359
1284205204
649091
2602048
267517
2602048
2173
2602048
539
2600
1
8
111
2600
21007997
123325800
41443
379464
34780859
369977400
1
8
325
2172
109
1086
17501
144918
6783601
47243268
41443
379464
1
8
1
8
1
8
1
8
1
8
1
8
6817921
26457236
137669
389077
3273047
6614309
14
51
400855
1128748
9227451
19188716
84254039
305304904
6359811
17959112
146585641
305304904
14
51
1
4
20210811
71428504
778055
10204072
30420801
71428504
2207001
8479108
829075
8479108
1015272
2119777
2582043
9594358
29667
282187
97
204
82393037
305304904
1870033
17959112
144724639
305304904
6750739
26457236
161599
1556308
6512503
13228618
539
2600
1
8
1411
2600
57575929
243811084
16739773
121905542
31280969
60952771
1
4
325
3044
1
2
57734437
243811084
27473225
243811084
31320596
60952771
64171105
243811084
27473225
243811084
29632175
60952771
1
4
1
8
1
2
652685
2602048
918029
2602048
1299603
2602048
1
4
107
204
1941311
8479108
737213
2119777
2163389
4239554
12563675
71428504
3329073
10204072
38067937
71428504
2173
2602048
649091
2602048
1568541
2602048
1
8
1543
7880
4367
7880
1
4
1309
2172
2071
88118848
22028393
88118848
53106999
88118848
1
4
23
224
22031031
88118848
9047575
88118848
2071
88118848
651933
2602048
267517
2602048
2173
2602048
1
4
325
3044
57734437
243811084
27473225
243811084
1688421
121905542
157624679
642102602
66661075
642102602
8872359
1284205204
6477879
26457236
161599
1556308
50903
6614309
1107568
4797179
29667
282187
5
204
37457
289836
53423
379464
1256804
11810817
37457
289836
92960075
629523792
62656123
629523792
57713491
369977400
53423
379464
9823453
123325800
53581
398088
31816525
216161784
20459171
216161784
53581
398088
31816525
216161784
128540063
216161784
57713491
369977400
53423
379464
71486353
123325800
68398413
305304904
2619745
17959112
158719263
305304904
23
102
163519
1128748
9961265
19188716
1
4
383
1086
1
2
22031783
88118848
31077287
88118848
44058105
88118848
22027641
88118848
31077287
88118848
44060743
88118848
1
4
79
224
1
2
5293451
71428504
15503441
71428504
5880091
10204072
89233
4239554
2032553
8479108
5068629
8479108
8872359
1284205204
157624679
642102602
193856188
321051301
7927813
305304904
70259415
305304904
10849589
17959112
50903
6614309
6477879
26457236
939753
1556308
Here are the polygons for those points. The first 12 polygons listed have mirror symmetry. The remaining 26 polygons form 13 pairs of identical polygons:
pol={{21,8,18,53,52,16,46,47,14,26,27,30,29,36,37,33,61,60,4,39,40,64,65,38,23,24,10,2},{1,5,6,58,59,32,35,34,12,28,26,14,15,49,50,17,56,57,19,9},{1,3,11,25,23,38,63,62,13,44,45,42,70,69,7,5},{1,9,20,21,2,3},{43,4,60,58,6,7,69,66},{49,15,48,46,16,51},{19,55,54,22,20,9},{22,54,56,17,18,8},{39,4,43,44,13,41},{62,63,65,64},{34,35,37,36},{32,33,37,35},{50,49,51,52,53},{36,34,12,31,29},{13,62,64,40,41},{43,44,45,67,66},{66,69,70,68,67},{27,30,31,12,28},{67,68,42,45},{14,15,48,47},{18,17,50,53},{59,32,33,61},{10,24,25,11},{59,61,60,58},{3,2,10,11},{55,54,56,57},{65,63,38},{46,47,48},{70,42,68},{52,16,51},{39,41,40},{26,27,28},{24,23,25},{29,31,30},{7,6,5},{57,19,55},{21,22,8},{21,22,20}};
We can verify those pairs are identical:
In[]:=
Table[((EuclideanDistance@@#)^2&/@Partition[vv[[pol[[k]]]],2,1,1])-((EuclideanDistance@@#)^2&/@Partition[vv[[pol[[k+1]]]],2,1,1]),{k,13,37,2}]
Out[]=
{{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}}
We can group edges by length. Amazingly, except for edge 21-22, every edge length is used exactly three times:
In[]:=
edges=First/@Transpose/@Sort[SplitBy[SortBy[{#,(EuclideanDistance@@vv[[#]])^2}&/@Sort[(First/@Tally[Sort/@Flatten[Partition[#,2,1,1]&/@pol,1]])],Last],Last]];
In[]:=
Length/@edges
Out[]=
{1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3}
If we reflect the generator on all faces, the identical polygons will have the same distances from the generator:
In[]:=
reflections=Table[ResourceFunction["ReflectPoints"][RandomSample[vv[[pol[[k]]]],3],generator],{k,1,38}];
In[]:=
Partition&/@reflections,2
2
EuclideanDistance[generator,#]
Out[]=
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
8873
6097032
342373
6097032
394307
6097032
24497
1016172
132491
254043
3370585
6097032
195929
254043
4564187
6097032
5941
62856
3014401
6097032
4505485
6097032
375763
508086
43039
62856
43039
62856
1695881
6097032
1695881
6097032
3029149
6097032
3029149
6097032
1888021
6097032
1888021
6097032
4247111
6097032
4247111
6097032
4153891
6097032
4153891
6097032
3
4
3
4
266347
508086
266347
508086
514435
6097032
514435
6097032
453053
6097032
453053
6097032
4069019
6097032
4069019
6097032
4188365
6097032
4188365
6097032
191899
6097032
191899
6097032
Here’s a picture of Engel-38, with black lines indicating mirror symmetry. The 38 green spheres are each in the plane of one of the 38 faces, at the midpoint between the reflected generator point.
In[]:=
Graphics3D[{Opacity[.8],Polyhedron[vv,pol],Table[{Hue[k/36],Tube[vv[[#]],.002]&/@edges[[k]]},{k,1,36}],Opacity[1],Black,Table[Tooltip[Sphere[vv[[n]],.004],n],{n,1,70}],Green,Table[With[{m=Mean[{reflections[[n]],generator}]},{Tooltip[Sphere[m,.005],n],Line[{m,Mean[vv[[pol[[n]]]]]}]}],{n,1,38}],Red,Sphere[generator,.01],Black,Line[{vv[[#]]}]&/@{{21,37},{1,26},{1,13},{1,21},{43,6},{49,46},{19,22},{22,17},{39,44},{1,21},{62,65},{34,37},{32,37}}},Boxed->False]
Out[]=
With that and a usage of barycentric or areal coordinates, we can generate the 38 copies surrounding the base polyhedron. In each case, we’re either flipping a polygon with mirror symmetry or using a paired identical polygon:
In[]:=
symmetric=Table[ResourceFunction["Areal"][Append[vv[[Take[RotateRight[Reverse[pol[[k]]]],3]]],reflections[[k]]],#]&/@(ResourceFunction["Areal"][Append[vv[[Take[pol[[k]],3]]],generator],#]&/@vv),{k,1,12}];
In[]:=
duplicated1=Table[ResourceFunction["Areal"][Append[vv[[Take[pol[[k+1]],3]]],reflections[[k+1]]],#]&/@(ResourceFunction["Areal"][Append[vv[[Take[pol[[k]],3]]],generator],#]&/@vv),{k,13,37,2}];
In[]:=
duplicated2=Table[ResourceFunction["Areal"][Append[vv[[Take[pol[[k]],3]]],reflections[[k]]],#]&/@(ResourceFunction["Areal"][Append[vv[[Take[pol[[k+1]],3]]],generator],#]&/@vv),{k,13,37,2}];
In[]:=
all=Join[symmetric,duplicated1,duplicated2];
With all that, we can completely surround Engel-38 with copies of itself, with red spheres at reflected generator points.
In[]:=
Graphics3D[{{Red,Polyhedron[vv,pol]},Opacity[.3],Polyhedron[#,pol]&/@all,Opacity[.5],Green,Sphere[#,.01]&/@reflections},Boxed->False,SphericalRegion->True,ImageSize->Large]
Out[]=
We can zoom in on the structure at the middle:
The full structure has rotational symmetry around the green pole. Here are twelve Engel-38’s:
I knew Engel-38 would look complicated, but this is even more complex than I expected. I wasn’t expecting every face to have an odd mirror. That makes sense, though, an asymmetric 3D figure cannot use mirror reflections. If you’d like the other end of the spectrum, there are five space-filling tetrahedra. Two of them can duplicate themselves:
CITE THIS NOTEBOOK
CITE THIS NOTEBOOK
Engel 38-sided space-filling polyhedron
By Ed Pegg
Wolfram Community, STAFF PICKS, September 16, 2022
https://community.wolfram.com/groups/-/m/t/2617634
By Ed Pegg
Wolfram Community, STAFF PICKS, September 16, 2022
https://community.wolfram.com/groups/-/m/t/2617634