Hypershapes often captivate the imagination but they are difficult to understand and hard to visualize. One method for understanding a shape is to see it as a stack of its cross-sections. We start by looking at some 3D polyhedra, namely the cube and dodecahedron, and compute some of polygons that form their 2D cross-sections. We then look at the 4D polytopes and analyze how they are constructed; their 3D cross-sections forming a rich variety.

Included Paclet

We make use of the ConvexPolytope paclet for computing and operating on discrete convex polytopes:
In[]:=
PacletInstall["DuganHammock/ConvexPolytope"]​​Needs["DuganHammock`ConvexPolytope`"]
Out[]=
PacletObject
Name: DuganHammock/ConvexPolytope
Version: 1.0.1


2D Slices of 3D Polyhedra

First let’s start with some 3D Platonic solids and look at the 2D polygons that are formed when we take cross-sections.

Cube

Let’s start with the cube:
In[]:=
cubeVertices=Tuples[{-.5,.5},3];​​cubePolytope=cubeVertices//ConvexPolytope;​​Graphics3D[​​{Opacity[0.8],cubePolytope//Polygon}​​,Boxed->False​​,ImageSize->300​​,Lighting->"Neutral"​​]
Out[]=
We first look at planar slices of the cube that are parallel to the top and bottom faces -- planes perpendicular to the vector (0,0,1) at a range of offsets:
In[]:=
cubeVertices=Tuples[{-.5,.5},3];​​cubePolytope=cubeVertices//ConvexPolytope;​​sliceNormal={0,0,1};​​Table[​​slicePolytope=cubePolytope["Slice",sliceNormal,sliceValue];​​Graphics3D[{Specularity[1,20],​​{Opacity[0.3],cubePolytope//Polygon},​​{Red,slicePolytope//Polygon},​​{Darker[Red,.7],slicePolytope//Tube[0.05]}​​}​​,Lighting->"Neutral"​​,Boxed->False​​,PlotRange->.6​​,ImageSize->100​​]​​,{sliceValue,{-0.5,-.25,0,.25,0.5}}​​]//Row
Out[]=
All of these slices are squares, which makes sense because the cube can be constructed as a vertical extrusion of the bottom face to the top face. Next, we look at cross-sections which are perpendicular to normal vector (1,-1,1):
In[]:=
cubeVertices=Tuples[{-.5,.5},3];​​cubePolytope=cubeVertices//ConvexPolytope;​​sliceNormal={1,-1,1};​​Table[​​slicePolytope=cubePolytope["Slice",sliceNormal,sliceValue];​​Graphics3D[{Specularity[1,20],​​{Opacity[0.3],cubePolytope//Polygon},​​{Red,slicePolytope//Polygon},​​{Darker[Red,.7],slicePolytope//Tube[0.05]}​​}​​,Lighting->"Neutral"​​,Boxed->False​​,PlotRange->.6​​,ImageSize->100​​]​​,{sliceValue,{-.8,-.4,.0,.4,.8}}​​]//Row
Out[]=
In this sequence there are no squares!
It is interesting to note that the equatorial slice is a hexagon:
In[]:=
cubeVertices=Tuples[{-.5,.5},3];​​cubePolytope=cubeVertices//ConvexPolytope;​​slicePolytope=cubePolytope["Slice",{1,-1,1},0];​​Graphics3D[{Specularity[1,20],​​{Opacity[0.3],cubePolytope//Polygon},​​{Red,slicePolytope//Polygon},​​{Darker[Red,.7],slicePolytope//Tube[0.03],slicePolytope//Sphere[0.05]}​​}​​,Lighting->"Neutral"​​,Boxed->False​​,PlotRange->.6​​,ImageSize->300​​]
Out[]=

Dodecahedron

Now let’s look at the dodecahedron:
dodecahedronVertices=PolyhedronData["Dodecahedron","VertexCoordinates"]//N;​​dodecahedronPolytope=dodecahedronVertices//ConvexPolytope;​​Graphics3D[​​{Opacity[0.8],dodecahedronPolytope//Polygon}​​,Boxed->False​​,ImageSize->300​​,Lighting->"Neutral"​​]
Out[]=
We’ll start again by looking at horizontal slices that are parallel to the top and bottom pentagonal faces:
In this orientation, the equatorial slice is decagon:
Now we take slices along a vertex-first orientation:
Another hexagon! This time as an equatorial slice of a dodecahedron:
In fact, there are three parallel hexagons inscribed in the dodecahedron. The equatorial hexagon is larger than the other two:
It is not so obvious that the dodecahedron should have these inscribed hexagons, and their arrangement within the shape is interesting:

3D Slices of 4D Polyhedra

Now that we’ve had some practice taking 2D slices out of 3D shapes, let’s move on to hypershapes! It sounds intimidating but it doesn’t have to be, the workflow is exactly the same.

Hypercube

When plotting the hypercube, we need to project it down to 3-dimensions and convert it graphics primitives for use with Graphics3D. ConvexPolytope takes care of this projection automatically. For the hypercube, the canonical projection to the (x,y,z) 3-plane is just a cube:
In order to see more of the hypercube in the projection, we first need to tilt or rotate it so that its vertices don’t overlap so much in the projection:
This looks much more like it! Instead of rotating the hypershape before projection, it is often useful to apply a skew-transformation instead, one that tilts the w-axis towards some direction in the (x,y,z) 3-plane. This deforms the hypershape so that its 3D projection is stretched out. Below we see the hypercube skewed so that the bottom cube facet is plotted to the left and the top cube facet is plotted to the right:
Now for some cross-sections! We take 3D slices which are parallel to the top and bottom cubic facets:
These slices are all cubes, starting at the bottom cubic facet and sliding all the way up to top cubic facet. This is completely analogous to when we first sliced the cube:
Now we take a vertex-first orientation and take slices which are perpendicular to a body diagonal of the hypercube. Since we are plotting our hypershape under projection, it is best to keep the slice normal fixed to the w-axis and to use rotation the hypershape so the desired slicing axis is aligned to the w-axis. When we take slices starting at a vertex, we get a much different look at the hypercube:
The slices near the vertices are tetrahedrons and the equatorial slice is an octahedron. If we instead start at an edge, we see triangular prisms near the corners and the equatorial slice is an extruded hexagon:

24-Cell

We’ll look at the 24-cell next. This polytope has 24 vertices, 96 edges, 96 triangles, and 24 octahedral facets (each consisting of 6 vertices):
With a skew-projection, we can see the 42-cell a bit more clearly. We can see that the top and bottom facets are octahedra and that there is a cuboctahedron in the center:
As one might expect, we see octahedral slices at the top and bottom facets, the equatorial slice is a cuboctahedron, and in-between are truncated octahedra:
Slicing across a body diagonal for a vertex-first orientation, we see the slices nearby the top and bottom vertices are cubes, next to them are chamfered cubes, and the equatorial slice is a rhombic dodecahedron:

600-cell

Finally, let’s tackle the 600-cell! This polytope consists of 120 vertices, 720 edges, 1200 triangles, and 600 tetrahedrons:
Sometimes it’s convenient to show multiple slices in the same plot, with a wider tilt in the skew transformation used for the projection. The facet-first orientation has slices which are tetrahedra on the top and bottom and all kinds of interesting polytopes in-between:
Slicing along a vertex-first orientation we see the vertex figures are icosahedra and the equatorial slice is something called a pentakis icosidodecahedron:

CITE THIS NOTEBOOK

4D polyhedra and their 3D cross-cections​
by Dugan Hammock​
Wolfram Community, STAFF PICKS, July 25, 2023
​https://community.wolfram.com/groups/-/m/t/2976217