Space-Filling Pentahedron

Author

Eric W. Weisstein
July 28, 2026

This notebook downloaded from http://mathworld.wolfram.com/notebooks/Polyhedra/SpaceFillingPentahedron.nb.

For more information, see Eric's MathWorld entry http://mathworld.wolfram.com/SpaceFillingPentahedron.html.

©2026 Wolfram Research, Inc. except for portions noted otherwise

Additional Authors

Coordinate data and construction code from
Ed Pegg, Jr.
July 27, 2026

Definitions

pointTransform[points_, matrix_, shift_] := (matrix . # + shift) & /@ points;
uniquePointSets[sets_] := DeleteDuplicates[Sort /@ sets];
symmetryOrbit[seed_, center_, matrices_] := uniquePointSets[
	pointTransform[seed, #, center - # . center] & /@ matrices
	];
pieceVolume[points_] := RegionMeasure[ConvexHullMesh[points]];
squaredDistanceKey[points_] := Sort[SquaredEuclideanDistance @@@ Subsets[points, {2}]];
isometryMatrixQ[matrix_] := Simplify[Transpose[matrix] . matrix == IdentityMatrix[3]] && MemberQ[{-1, 1}, Det[matrix]];
primitivePoints[Polygon[points_]] := points;
primitivePoints[Triangle[points_]] := points;
planeKey[points_] := Module[{normal, vector, position},
	normal = Cross[points[[2]] - points[[1]], points[[3]] - points[[1]]];
	vector = RootReduce[Append[normal, -normal . points[[1]]]];
	position = First[FirstPosition[vector, Except[0]]];
	RootReduce[vector/vector[[position]]]
	];
faceCount[points_] := Length[DeleteDuplicates[
	planeKey /@ (primitivePoints /@ MeshPrimitives[ConvexHullMesh[points], 2])
	]];
entryCheck[entry_] := Module[{pieces, unionVolume, totalVolume, hullVolume},
	pieces = entry["Pieces"];
	unionVolume = Quiet[RegionMeasure[RegionUnion @@ (ConvexHullMesh /@ pieces)], BoundaryMeshRegion::bsuncl];
	totalVolume = Total[pieceVolume /@ pieces];
	hullVolume = RegionMeasure[ConvexHullMesh[DeleteDuplicates[Flatten[pieces, 1]]]];
	<|
		"Pieces" -> Length[pieces],
		"FiveFaces" -> faceCount[entry["Seed"]] == 5,
		"Isometries" -> And @@ (isometryMatrixQ /@ entry["Matrices"]),
		"Congruent" -> SameQ @@ (squaredDistanceKey /@ pieces),
		"DisjointAndComplete" -> Simplify[unionVolume == totalVolume == hullVolume]
		|>
	];
pieceGraphic[points_] := Graphics3D[
	{Directive[StandardOrange, Opacity[0.72], EdgeForm[Directive[LightDarkSwitched@Black, Thin]]], MeshPrimitives[ConvexHullMesh[points], 2]},
	Boxed -> False, Lighting -> "ThreePoint", PlotRange -> All,
	SphericalRegion -> True,
	ViewPoint -> {1.7, -2.1, 1.35}
	];
cellGraphic[pieces_] := Module[{allPoints},
	allPoints = DeleteDuplicates[Flatten[pieces, 1]];
	Graphics3D[
		{
			MapIndexed[
				{ColorData[97][1 + Mod[First[#2] - 1, 12]], Opacity[0.52], EdgeForm[Directive[LightDarkSwitched@Black, Thin]], MeshPrimitives[ConvexHullMesh[#1], 2]} &,
				pieces
				],
			Directive[LightDarkSwitched@Black, Opacity[1], AbsoluteThickness[1.15]], MeshPrimitives[ConvexHullMesh[allPoints], 1]
			},
		Boxed -> False, Lighting -> "ThreePoint", PlotRange -> All,
		SphericalRegion -> True,
		ViewPoint -> {1.7, -2.1, 1.35}
		]
	];
entryCard[entry_] := Labeled[
	Row[{pieceGraphic[entry["Seed"]], cellGraphic[entry["Pieces"]]}],
	Style[Row[{entry["Goldberg"], ": ", entry["Name"]}],  Italic, 14, FontFamily -> "Times", LightDarkSwitched@Black], Top
	];

Data

These are six exact, published special representatives from Goldberg's construction types. The list is illustrative, not a classification, and Goldberg's types are not mutually exclusive.

permutationMatrices = PermutationMatrix /@ Permutations[Range[3]];
signMatrices = DiagonalMatrix /@ Tuples[{-1, 1}, 3];
allSignedMatrices = DeleteDuplicates[Flatten[Outer[Dot, permutationMatrices, signMatrices, 1], 1]];
triangularPrismSeed = {{0, 0, 0}, {1, 0, 0}, {1, 1, 0}, {0, 0, 1}, {1, 0, 1}, {1, 1, 1}};
triangularPrismMatrices = {IdentityMatrix[3], {{0, 1, 0}, {1, 0, 0}, {0, 0, 1}}};
triangularPrismPieces = pointTransform[triangularPrismSeed, #, {0, 0, 0}] & /@ triangularPrismMatrices;
squarePyramidSeed = {{0, 0, 0}, {1, 0, 0}, {1, 1, 0}, {0, 1, 0}, {1/2, 1/2, 1/2}};
squarePyramidPieces = symmetryOrbit[squarePyramidSeed, {1/2, 1/2, 1/2}, allSignedMatrices];
rhombicDodecahedronVertices = Join[
	Tuples[{-1/4, 1/4}, 3],
	Flatten[Table[ReplacePart[{0, 0, 0}, axis -> sign/2], {axis, 3}, {sign, {-1, 1}}], 1]
	];
rhombicPyramidSeed = Append[Select[rhombicDodecahedronVertices, # . {1, 1, 0} == 1/2 &], {0, 0, 0}];
rhombicPyramidPieces = symmetryOrbit[rhombicPyramidSeed, {0, 0, 0}, allSignedMatrices];
cubeFourSplitSeed = {{-1, -1, -1}, {-1, -1, 1}, {-1, 1, 1}, {0, -1, 1}, {1, 1, 1}};
cubeFourSplitMatrices = {
	IdentityMatrix[3],
	{{-1, 0, 0}, {0, 0, -1}, {0, -1, 0}},
	{{1, 0, 0}, {0, 0, 1}, {0, 1, 0}},
	{{-1, 0, 0}, {0, -1, 0}, {0, 0, -1}}
	};
cubeFourSplitPieces = pointTransform[cubeFourSplitSeed, #, {0, 0, 0}] & /@ cubeFourSplitMatrices;
goldbergXIVBase = {{0, 0}, {2, 0}, {1, Sqrt[3]}};
goldbergXIVHeights = {0, 1/4, 3/4};
goldbergXIVCenter = {1, Sqrt[3]/3, 0};
goldbergXIVRotation = {{-1/2, -Sqrt[3]/2, 0}, {Sqrt[3]/2, -1/2, 0}, {0, 0, 1}};
goldbergXIVPieces[rise_] := Module[{lower, upper, seed},
	lower = MapThread[Append, {goldbergXIVBase, goldbergXIVHeights}];
	upper = MapThread[Append, {goldbergXIVBase, (# + rise) & /@ RotateRight[goldbergXIVHeights]}];
	seed = DeleteDuplicates[Join[lower, upper]];
	Table[
		pointTransform[
			seed, MatrixPower[goldbergXIVRotation, k],
			goldbergXIVCenter - MatrixPower[goldbergXIVRotation, k] . goldbergXIVCenter + {0, 0, k rise}
			],
		{k, 0, 2}
		]
	];
goldbergXIV1Pieces = goldbergXIVPieces[1];
goldbergXIV0Pieces = goldbergXIVPieces[1/2];
goldbergXIVMatrices = Table[MatrixPower[goldbergXIVRotation, k], {k, 0, 2}];
entries = {
	<|"Goldberg" -> "5-I", "Name" -> "triangular prism", "Seed" -> triangularPrismSeed, "Pieces" -> triangularPrismPieces, "Matrices" -> triangularPrismMatrices|>,
	<|"Goldberg" -> "5-II-0", "Name" -> "square pyramid special case", "Seed" -> squarePyramidSeed, "Pieces" -> squarePyramidPieces, "Matrices" -> allSignedMatrices|>,
	<|"Goldberg" -> "5-IV", "Name" -> "rhombic pyramid special case", "Seed" -> rhombicPyramidSeed, "Pieces" -> rhombicPyramidPieces, "Matrices" -> allSignedMatrices|>,
	<|"Goldberg" -> "5-VIII-0", "Name" -> "four-piece cube split", "Seed" -> cubeFourSplitSeed, "Pieces" -> cubeFourSplitPieces, "Matrices" -> cubeFourSplitMatrices|>,
	<|"Goldberg" -> "5-XIV-1", "Name" -> "truncated prism", "Seed" -> First[goldbergXIV1Pieces], "Pieces" -> goldbergXIV1Pieces, "Matrices" -> goldbergXIVMatrices|>,
	<|"Goldberg" -> "5-XIV-0", "Name" -> "trapezoidal pyramid", "Seed" -> First[goldbergXIV0Pieces], "Pieces" -> goldbergXIV0Pieces, "Matrices" -> goldbergXIVMatrices|>
	};

Figures

In each panel, the orange pentahedron is the seed and the multicolored solid is an assembled space-filling cell.

GraphicsGrid[
Partition[entryCard/@entries,UpTo[3]],
Dividers->All,
Alignment->Top,
PlotRange->All,
ImageSize->700
]

References

M. Goldberg, "The Space-Filling Pentahedra," Journal of Combinatorial Theory, Series A 13 (1972), 437-443. https://doi.org/10.1016/0097-3165(72)90077-5

M. Goldberg, "The Space-Filling Pentahedra. II," Journal of Combinatorial Theory, Series A 17 (1974), 375-378. https://doi.org/10.1016/0097-3165(74)90101-0