During my time in graduate school, I learned to make mathematical illustrations in Mathematica mostly by trial, error, and incremental improvement. I am particularly interested in making high-quality illustrations of two and three dimensional hyperbolic space, the geometry of the three sphere, convex real projective structures, and complex dynamics. Below is a selection of programs with descriptions and comments, which will hopefully be of use to others trying to learn.

Hopf and Seifert Fibrations

The Hopf and Seifert fibrations of $\mathbb{S}^3$ fill the sphere with linked circles and torus knots. This program visualizes these through stereographic projection, taking as input a point of the plane (really, an affine patch of $\mathbb{C}\mathsf{P}^1$) and plotting the corresponding circle/fiber.

Flat Tori in the 3-Sphere

This program takes as input a curve on $\mathbb{S}^2$ and draws the surface in $\mathbb{S}^3$ which is its preimage under the Hopf map. This generalizes easily to drawing surfaces in ruled by the fibers of the Seifert fibrations as well, and is useful in constructing flat tori.


In four dimensions, there are six regular polytopes: five higher-dimensional analogs of the platonic solids, and the 24 cell. Interpreted as regular tilings of the three-sphere, this program allows the visualization of these through both stereographic and perspective projection into $\mathbb{R}^3$.

Klein Model of $\mathbb{H}^2$

The hyperboloid of two sheets, realized as the sphere of radius -1 in Minkowski space, inherits a metric of constant curvature -1. This program utilizes this to draw hyperbolic tilings in the Klein model, the projectivization of the hyperboloid onto an affine patch in $\mathbb{R}\mathsf{P}^2$

Poincare Model of $\mathbb{H}^2$

The Poincare disk is a model of hyperbolic geometry built within the complex projective space $\mathbb{C}\mathsf{P}^1$. This program draws hyperbolic tilings in the Poincare disk, computing geodesics from their endpoints on the boundary by finding the unique orthogonal circle.

Convex Real Projective Triangle Groups

Tilings of $\mathbb{H}^2$ by triangles are rigid, but deform nontrivially into real projective geometry. This program animates the 1-parameter family of deformations of the $(p,q,r)$ reflection group, following Anton Lukyanenko's master's thesis, available here.

Complex Function Plots

The graph of a complex function is a subset of $\mathbb{C}^2$, and so it is often easier to think about these objects via domain coloring, or coloring a point $z\in\mathbb{C}$ using its image data $f(z)$. This program takes as input arbitrarly complex functions and draws the associated domain coloring of a pre-specified region in $\mathbb{C}$.

GLSL Shaders

Shaders compute images pixel by pixel, in parallel on the GPU. I am just beginning to learn to work with shaders, motivated by a project of Henry Segerman, Michael Woodard and Roice Nelson which draws geometriclly correct views of the interior of Hyperbolic space. I have been working during the ICERM semester Illustrating Mathematics to improve and extend this to other geometries. I am very new at this, but am excited by the potential of GPU computing to draw other complex objects - watch this space for more!


Euclidean Raymarch

The cubical tiling of Euclidean space provides a familiar starting point to exploring 3 dimensional geometries. This scene is ray marched, meaning rays travel along straight lines (geodesics) from the screen into the scene to determine what is rendered.

Hyperbolic Raymarch

Ideal cubes, meeting six to an edge, tile hyperbolic space. Like the Euclidean view above, these images are generated via raymarching along geodesics, providing an accurate view of the intrinsic geometry of hyperbolic space.

Spherical Raymarch

Instead of meeting six to an edge (hyperbolic) or four to an edge (euclidean), when cubes meet three to an edge, the configuration is forced to close up and forms the hypercube, a tiling of the 3-sphere.


I am currently trying to broaden my illustration skills by learning Javascript - specifically Threejs. Follow along here for a collection of programs of (hopefully) increasing complexity!

A parametric Surface

This is my first javascript test program! It is basically just the supporting code needed to render a parametrized surface. Hopefully will be moving onto cooler things soon!

Family of Dini Surfaces

This is a test program for making animated paramererized surfaces in javascript. Dini's surface is an isometric embedding of a horoball in $\mathbb{H}^2$ into $\mathbb{R}^3$; this program renders a 1-parameter family of such surfaces as they collapse onto a pseudosphere.