ABSTRACT (original article): Symbolic and graphical tools, such as Mathematica, enable precise visualization and analysis of void spaces in sphere packings. In the cubic close packing (CCP, or face-centred cubic packing; FCC) arrangement these voids can be partitioned into repeating geometric units we term spherically truncated polyhedra - bodies analogous to plane-truncated polyhedra but bounded by both planar and spherical surfaces. These structures are relevant in geometric studies and applications such as modelling diffusion in porous media and biological tissues. This work examines the properties of these complementary bodies, deriving their surface area-to-volume ratios, which are significant in physical contexts; and we establish a result concerning the packing density of truncated tetrahedra and octahedra, demonstrating how they tile the interstitial space surrounding packed spheres. These findings contribute to a deeper understanding of classical packing problems and their geometrical complements. CITATION (original article): Philip W. Kuchel (2025), Complementary bodies in sphere packing, arXiv:2508.11633. https://doi.org/10.48550/arXiv.2508.11633
AIM: Show that there are two different complementary bodies in a cubic-close-packed array of spheres of uniform size; and that the smaller of the two shapes has two distinct sets with different orientations
Begin with four ‘basis’ position-vectors, and use an opaque representation of the spheres that are centred on these positions to help visualize the partitioning of the space between them. This is the form of the array of cannonballs seen in historical sites (e.g., in the Castel Sant’Angelo in Rome). The first layer of cannonballs are in a square (or rectangular) formation with a low surrounding wooden frame into which they snugly fit. For the second layer the balls are placed into the “cuspate” or “hopper-like” depressions between the balls in the first layer, and so forth, building up a pyramid that has a single ball at its apex (or row of balls if there is a rectagular base). We start by showing this arrangement with four spheres capped by a single sphere
In[]:=
v1={0,0,0};​​v2={-2,0,0};​​v3={0,2,0};​​v4={-2,2,0}​​gph1=Graphics3D[{Green,Opacity[0.4],Sphere[v1,1],Sphere[v2,1],Sphere[v3,1],Sphere[v4,1]},Axes->True,AxesOrigin->{0,0,0}]
Out[]=
{-2,2,0}
Out[]=
In[]:=
ByteCount[gph1]
Out[]=
1288
Add one more sphere on top
In[]:=
v5=-1,1,
2
;​​gph2=Graphics3D[{Green,Opacity[0.4],Sphere[v1,1],Sphere[v2,1],Sphere[v3,1],Sphere[v4,1],Sphere[v5,1]},Axes->True,AxesOrigin->{0,0,0}]
Out[]=
Make a new tessellation based on the centres of the assembly
In[]:=
tessel1=Flatten[Table[iv2+jv3+kv5,{i,0,2},{j,0,2},{k,-1,1}],2];​​sphereArray1=Graphics3D[{Green,Opacity[0.7],Sphere[#,1]}]&/@tessel1;​​gph3=Show[sphereArray1,AxesLabel->{x,y,z},Axes->True,AxesOrigin->{0,0,0},AxesStyleDirective[Red,Thick,Plain],LabelStyleDirective[Bold,Blue,Medium,FontFamily{"Arial"}],Boxed->False]
Out[]=
In[]:=
gph3NoAxes=Show[sphereArray1,Axes->False,AxesOrigin->{0,0,0},Boxed->False]
Out[]=
In[]:=
tessel1=Flatten[Table[iv2+jv3+kv5,{i,0,2},{j,0,2},{k,-1,1}],2]
Out[]=
1,-1,-
2
,{0,0,0},-1,1,
2
,1,1,-
2
,{0,2,0},-1,3,
2
,1,3,-
2
,{0,4,0},-1,5,
2
,-1,-1,-
2
,{-2,0,0},-3,1,
2
,-1,1,-
2
,{-2,2,0},-3,3,
2
,-1,3,-
2
,{-2,4,0},-3,5,
2
,-3,-1,-
2
,{-4,0,0},-5,1,
2
,-3,1,-
2
,{-4,2,0},-5,3,
2
,-3,3,-
2
,{-4,4,0},-5,5,
2

Shift the array so that the sphere that is in the middle of the array, surrounded in all directions by other spheres, is now at the origin
In[]:=
shiftVector={-2,2,0};
In[]:=
tessel1Shifted=Flatten[Table[iv2+jv3+kv5-shiftVector,{i,0,2},{j,0,2},{k,-1,2}],2]
Out[]=
3,-3,-
2
,{2,-2,0},1,-1,
2
,0,0,2
2
,3,-1,-
2
,{2,0,0},1,1,
2
,0,2,2
2
,3,1,-
2
,{2,2,0},1,3,
2
,0,4,2
2
,1,-3,-
2
,{0,-2,0},-1,-1,
2
,-2,0,2
2
,1,-1,-
2
,{0,0,0},-1,1,
2
,-2,2,2
2
,1,1,-
2
,{0,2,0},-1,3,
2
,-2,4,2
2
,-1,-3,-
2
,{-2,-2,0},-3,-1,
2
,-4,0,2
2
,-1,-1,-
2
,{-2,0,0},-3,1,
2
,-4,2,2
2
,-1,1,-
2
,{-2,2,0},-3,3,
2
,-4,4,2
2

In[]:=
sphereArray1A=Graphics3D[{Green,Opacity[0.4],Sphere[#,1]}]&/@tessel1Shifted;​​gph3A=Show[sphereArray1A,Axes->True,AxesOrigin->{0,0,0}]
Out[]=
Peel off extraneous spheres leaving only a layer of spheres surrounding the sphere centred on the origin, and color it red to highlight it
In[]:=
tessel1ShiftedB=(*3,-3,-
2
,*){2,-2,0},1,-1,
2
,(*3,-1,-
2
,*){2,0,0},1,1,
2
,(*3,1,-
2
,*){2,2,0},(*1,3,
2
,*)(*1,-3,-
2
,*){0,-2,0},-1,-1,
2
,1,-1,-
2
,{0,0,0},-1,1,
2
,1,1,-
2
,{0,2,0},(*-1,3,
2
,*)(*-1,-3,-
2
,*){-2,-2,0},(*-3,-1,
2
,*)-1,-1,-
2
,{-2,0,0},(*-3,1,
2
,*)-1,1,-
2
,{-2,2,0}(*,-3,3,
2
*),0,0,2
2
,0,0,-2
2
;​​sphereArray1B=Graphics3D[{Green,Opacity[0.7],Sphere[#,1]}]&/@tessel1ShiftedB;​​gph3B=Show[sphereArray1B,AxesLabel->{x,y,z},Axes->True,AxesOrigin->{0,0,0},AxesStyleDirective[Red,Thick,Plain],LabelStyleDirective[Bold,Blue,Medium,FontFamily{"Arial"}],Boxed->False]​​gph3BNoAxes=Show[sphereArray1B,Axes->False,AxesOrigin->{0,0,0},Boxed->False]
Out[]=
Find the centroids of the surrounding voids defined by this array...note that there are six (6) of the large voids surrounded by six spheres and eight (8) of the smaller voids surrounded by four spheres on top, and the same below.
Centroids for the large voids (which I call spherically truncated octahedra, STOs; or sphero-planar cuboctahedra) are at allCentroidsSTO, and Plot all six centroids based on inspection of the graphic:
Now define the upper four smaller voids (which I call spherically truncated tetrahedra, STTs; or sphero-planar octahedra). These are the STT centroids, based on inspection of the graphic...embellish the graphic of the tetrad with the centroids of the upper four inter-sphere spaces
Finally, plot one of the lower set of four STTs and embellish the graphic with the centroids of the lower four inter-sphere spaces
To begin the process of forming the bodies (complementary to the spheres) that completely fill the void between the spheres, I consider the unit array of six (6) spheres; and I centre the unit array on the origin by translating the centres of the spheres accordingly. Note that the limits of the body are determined by the surfaces of the spheres and, perhaps, seemingly arbitrarily (but as we shall see, symmetry demands this) cut off by the planes that encompass three of the centres of each of the surrounding spheres. Hence, there are six (6) such intersecting planes. These give rise to the planar surfaces of the body
Draw straight lines connecting the six centres of the spheres and label them for use in defining the planes that contain three centres each
Generate expressions for the eight planes that make up the sides of the octahedron. Define the six sphere centres as aA, bB, cC, dD, eE, and fF with coordinates as given above...and label the plane functions with the letters that define the sphere centres through which they pass
Expressions for the planes abe, bce, cde, dae, afb, bcf, cfd,dfa are generated by using my planeGenerator Module

My 'plane generator' Module

The definition of the planes is a little tricky as the sign of the normal must be specified. Set up the system by having the planes cutting a central sphere; and by trial and error use > or < in the expression for each of the eight planes...below is what works
Now, consider the six spheres in the array...introduce the scalar ζ as the square of each sphere radius, because using exact tangent surfaces can leave holes in the graphic of the complementary body
As noted above: the shape is a spherically truncated octahedron (STO); and executing the expression reproduces the shape. It can also be called a sphero-planar cuboctahedron. The so named STO is a GraphicsComplex (object) that can now be duplicated and moved around (affine-transformed) in Cartesian space, as can be done with standard (Primitive) shapes such as the Cuboid, Sphere etc
Taking Control of Styles...(from Harry Culkins)
Plot the STO in the centre of the cubic close packed unit of six spheres...beautiful!
Demonstrate shifting the object away from the origin with TranslationTransform...this works well
Use the centroid coordinates at which the STOs are located...with the previous centroids (listed above) to illustrate how the STOs stack together and yet they leave gaps that are filled with the STTs. Nevertheless, the spherical hole in the centre of the array is well outlined
Revert to illustrating simply one STO sitting on top of the central sphere, in readiness for the next developments
Draw straight lines connecting the four centres and annotate them using the now shifted centres of the four spheres
Generate the four shape-defining planes as was performed above for the STO
Place the STT between its shape-defining tetrad of spheres

Implement the means of moving the STTs around Cartesian space

This is the same as used above for the STOs...they have ‘B’ in the label here
Again, plot the STT correctly orientated between its shape-defining tetrad of spheres...there is something ‘elegant’ about this...I hope that you agree!
Plot the array of STTs onto the array of spheres leaving out the STOs but plotting their centroids
Note how there are still gaps to be filled...see that the green patches of the central sphere show through when the complex is viewed from below
Thus a third set of bodies must be considered. We need the array of their centroids as given above and orientate this set of STTs to ensure correct docking of the planar surfaces
Finally, make a sphere from six sphero-planar cuboctahedra and eight sphero-planar octahedra. Is this the first time that it has been done (at least using Mathematica)?
Place a black sphere in the centre of the ‘prickly bunch’ to highlight their complete coverage of the spherical hole

Conclusions

My main Aim has been realised:
1
.
I can graphically visualize the partitioned void (as bodies) between cubic close packed spheres.
2
.
Three dimensional space is totally tiled with the two groups of bodies...sphero-planar octahedra (also called spherically truncated tetrahedra; STTs) of two orthogonal orientations, and sphero-planar cuboctahedra (also called spherically truncated octahedra; STO) present in the ratio 4:3.
3
.
The two classes of complementary body can be treated like other Primitives (cuboid, sphere, polyhedra) that are present in Mathematica, and they can be moved around (affine transformed) in virtual three-space like these simpler bodies.

CITE THIS NOTEBOOK

Complementary bodies in sphere packing​
by Philip W. Kuchel​
Wolfram Community, STAFF PICKS, September 5, 2025
​https://community.wolfram.com/groups/-/m/t/3541154