Rhombic Spirallohedra

Some new classes of non-convex zonohedra

by
Russell Towle
April, 1997
rustybel@foothill.net

Discussion

Rhombic Spirallohedra

Polar zonohedra are bounded by n*(n-1) rhombic faces, where n is the number of directions in which edges occur.  Simple instances include the cube (n=3) and Kepler's rhombic dodecahedron (n=4); both of these exist in nature as crystals.  For any n >= 3, an infinite variety of polar zonohedra may be constructed, ranging from oblate, squashed forms, to prolate, spindle-like forms; the determining parameter is the angle between edges and a plane orthogonal to the polar zonohedron's symmetry axis, which I call "pitch," 0<=pitch<=90 degrees.  Curiously, when pitch equals arc tan .5^.5 or 35.2643+ degrees, a polar zonohedron is an isometric, orthogonal "shadow" of an n-cube (See §13 of H.S.M. Coxeter's Regular Polytopes, Dover, 1973).

(*A polar projection, and two equatorial projections,
of n=12 polar zonohedra.*)
Show[PolarZonohedron[12,35.2643],
PlotLabel->"n=12, pitch=35.2643",
ViewPoint->{0,0,3}];
Show[PolarZonohedron[12,15],(*oblate*)
PlotLabel->"n=12, pitch=15",
ViewPoint->{0,-3,0}];
Show[PolarZonohedron[12,60],(*prolate*)
PlotLabel->"n=12, pitch=60",
ViewPoint->{0,-3,0}];

The "rhombic spirallohedra" constructed in this notebook were discovered accidentally, while attempting to develop a function which created a rhombic hexahedron from a triple of vectors.  Eventually, more types of spirallohedra were recognized, and the common elements in their construction were fused to make a Spirallohedron function.  The function is by no means "robust," for it may only be applied to n>=6, and n not prime.

The complete syntax for the Spirallohedron function is
           Spirallohedron[n, pitch, klim], where
           
1.  n is the (integer) number of directions in which edges occur.
2.  pitch is the angle, in degrees (0<= pitch <= 90), between edges and a plane orthogonal to the symmetry axis.
3.  klim is an integer such that (n / klim) >= 3, and Mod[ n, klim] == 0.

Some of the forms below (when n is even and klim equals 2) are what result if, in a polar zonohedron, a shell of rhombic hexahedra is created such that only those hexahedra are made which share exterior faces of the polar zonohedron, and then this shell is removed, to reveal a "hidden" zonohedron.  The routine fails for odd n and when n=4 (no "hidden" zonohedron exists).  Perhaps the most striking forms arise when n/klim equals 3; I call these "cubic spirallohedra."

Show[Spirallohedron[21,35.2643,7],
Boxed->False,
ViewPoint->{0,0,3}];

Quite a variety of other non-convex zonohedra can be made by choosing other values for klim.  In fact, these other forms arose during the attempt to iterate methods used to construct the "hidden" zonohedron described above.  The iterated routine is a table of tables of tables, with complicated and opaque constraints applied to the loops.  Within these tables the quad function is invoked, which creates a rhomb from a list of two vectors.  The (unit) vectors are created in the vectors function, which accepts two arguments, n and pitch.  All the non-convex zonohedra ("spirallohedra") created represent types of "hidden" zonohedra which can arise by taking away certain sets of rhombic hexahedra from a polar zonohedron.  They are bounded by n*(n-klim) rhombic faces.

Two constraints must be met:  klim must divide n without remainder, and (n / klim) must be greater than or equal to 3.  Hence n>=6, and n not prime.  A method to discover all possible values for klim is as follows:

a=Table[{i,Mod[n,i]},{i,2,(n/2)-1}];
b=Select[a,#[[2]]==0&];
j=Transpose[b][[1]];(*the list of klims*)

This method is used in the Examples to create all the spirallohedra for n=24.

Initialization

vectors[n_Integer,pitch_]:=
Table[N[{Cos[Degree pitch] Cos[2Pi i/n],
	Cos[Degree pitch] Sin[2Pi i/n],
	-Sin[Degree pitch]}],
	{i,0,n-1}]
	
quad[x_,ref_]:={ref, ref+x[[1]], ref+x[[1]]+x[[2]], mark=ref+x[[2]]}

PolarZonohedron[n_Integer,pitch_]:=
Block[{v=vectors[n,pitch],h=((Plus @@ vectors[n,pitch])[[3]])/2, q},
	q=Table[mark={0,0,-h};
		Table[quad[{v[[j]],v[[1+Mod[i+j-1,n]]]},mark],{i,n-1}],{j,n}];
	Graphics3D[ Polygon /@ Flatten[q ,1] ]
]

Spirallohedron[n_Integer,pitch_,klim_Integer]:=
Block[{v=vectors[n,pitch],h=((Plus @@ vectors[n,pitch])[[3]])/2,q,t},
q=Table[Table[If[k==1,mark={0,0,-h},mark=({0,0,-h}+Sum[ v[[ 1+Mod[j+(t-2),n] ]],{t,k-1}])];
Table[quad[{v[[1+Mod[j+(k-2),n]]],v[[1+Mod[i+j+(k-2),n]]]},mark],
	{i,klim-(k-1),n-k}],
		{j,1,n-1,klim}],
			{k,klim}];
Graphics3D[ Polygon /@ Flatten[q ,2] ]
]

Examples

(* n/klim = 6 *)
Show[Spirallohedron[12,35.2643,2],
Boxed->False,
ViewPoint->{0,0,3}];

(* n/klim = 3 *)
Show[Spirallohedron[21,35.2643,7],
Boxed->False,
Background->GrayLevel[0],
ViewPoint->{0,-.5,3}];

(* n/klim = 7 *)
Show[Spirallohedron[21,35.2643,3],
Boxed->True,
Axes->True,
ViewPoint->{0,0,3}];

(* The entire series of spirallohedra for specified n *)
(* Warning:  n>=6 and n not prime!*)
n=24;
a=Table[{i,Mod[n,i]},{i,2,(n/2)-1}];
b=Select[a,#[[2]]==0&];
j=Transpose[b][[1]];(*the list of klims*)

Do[
	Show[Spirallohedron[n,35.2643,j[[i]]],
	Boxed->True,
	Axes->True,
	ViewPoint->{0,-1,3}],
{i,Length[j]}];