The Cover Image
Making the perforated hyperbolic dodecahedron symbolizing Mathematica 4
Copyright Michael Trott 1998
Outline of the Procedure
We start by building a regular dodecahedron with its center at the origin and with each vertex a unit distance from the origin.
The faces of the dodecahedron are then subdivided into right triangles, each of which is then scaled down a bit so that gaps are introduced between them.
Each triangle is further subdivided so that, when the surfaces are transformed in the next step, the surfaces which result will remain comparatively smooth.
All coordinates are transformed by , where the function maps each distance from the origin onto a new distance. In particular, moves the center of each face of the dodecahedron toward the origin but moves the vertices further away, up to a fixed maximum distance. Since is scalar, this transformation does not change the direction between the origin and each point, just the distance; we'll call it the radial transformation.
Each triangle is given depth by connecting it to a slightly smaller copy moved closer to the origin.
The faces of the resulting body are assigned colors.
Step 1: The Regular Dodecahedron
Step 2: Dividing into Triangles
ShrinkTriangles scales each triangle toward its center of gravity—that is, toward the average of its vertices—by a given factor. A scaling factor of 1 means no change; a factor of halves the size.
Step 3: Subdividing the Triangles
Steps 4 and 5: Radial Transformation and Thickening
The next task is to create a function for calculating the radial transformation.
As the following plot shows, this function has one of three different behaviors, depending on the initial distance of a point from the origin. For points nearest the origin, the transformation draws them closer still. All points beyond a certain distance from the origin are moved to a fixed limit. And points between these two ranges are moved away from the origin.
Each polygon has zero thickness, so the ThickenTransform builds solid 3D shapes by matching each polygon with a slightly offset, slightly smaller copy of itself, and then joining the corresponding edges with new polygons.
And here is a cross-section through the resulting surface.
Final Assembly and Coloring the Faces Individually
Incorporating the individual functions defined above leads us directly to the function CoverImage.
By taking out one of the faces, you can have a look inside the previous example.