Figuring out how to draw lines in hyperbolic space is pretty straightforward. It’s just some basic geometry and the details are easy to find with a little searching. What is not so easy to find is the details on how to construct a hyperbolic tessellation. There are plenty of images of hyperbolic tessellations, but nothing that describes the process of creating one in detail.
The best resources I’ve found so far are the work by Coxeter and Dunham. Coxeter did most of the seminal work in hyperbolic tessellations and corresponded with M.C. Escher when he was working on his Circle Limit drawings
There are two main problems to solve when creating a basic hyperbolic tessellation once the basic mechanics of hyperbolic geometry are worked out. First, for any particular regular polygon, the radius of the circumscribing circle needs to be calculated. Second, the pattern of transformations that tile the hyperbolic plane need to be enumerated. The paper The Trigonometry of Hyperbolic Tessellations by Coxeter is the only place I’ve found a clear solution for the first problem. For the second, the papers Creating Repeating Hyperbolic Patterns and Hyperbolic Symmetry by Dunham illustrate how tilings of the hyperbolic plane are generated from the fundamental region.
What I find fascinating about hyperbolic tilings as compared to Euclidean tilings is the dependence on distance. In the Euclidean plane, any sized square, rectangle and regular hexagon will tile the plane. In the hyperbolic plane, many different N-gons with different patterns of tilings are possible, but only if the shapes have a particular size.
The key technique we have to master in order to generate hyperbolic tessellations is that of inverse geometry, particularly taking the inverse with respect to a circle as this is how every polygon in the tessellation will be generated once the first polygon is placed in the plane. Since lines in the Poincaré model of the hyperbolic plane are really circular arcs, we can perform reflections over hyperbolic lines simply by taking the inverse with respect to the circle that the arc is on. The procedure for generating the tessellation is as follows:
- Calculate the radius of the circumscribing circle of the fundamental region.
- Calculate the positions of the vertices of the fundamental polygon on the circumscribing circle.
- Reflect the fundamental polygon across the edges of the fundamental polygon, generating N new polygons.
- For any edge on an existing polygon that only borders a single polygon, perform a reflection of that polygon across the edge to continue the tessellation
- Repeat step 4 ad infititum
Fundamental Region (1 & 2)
Calculating the radius of the circumscribing circle from first principles is rather involved so I’ll skip all of the details since they’re in the Coxeter paper mentioned above. The end result if a simple equation that can be applied and depends only on the number of sides the fundamental polygon has. One interesting note about the derivation is that it depends on what is called the Angle of Parallelism. In the above diagram, the angle of parallelism is the angle between AN and AO. The angles defining the tessellation are π/p and π/q where p is the number of sides of the fundamental polygon and q the number of polygons meeting at a vertex. In the case above (p, q) = (5, 4).
As you can see, the circle with center O on the line AC generates an parallel line at the angle of parallelism. Through a series of geometric operations, it can be shown that this circle defines precisely one of the edges of the fundamental polygon and since we know that the angle between vertices is 2π/p, we can draw a ray AB and intersect it with the circle to find the first vertex of the polygon. From there it is simply a matter of placing vertices every 2π/p radians at a distance AB from the center A to form the complete fundamental polygon.
The equations for calculating the center O and radius OC of the circle defining the fundamental polygon are:
- O = (d, 0, 0)
- length(OC) = r
- d = 1/sqrt(1-((s*s)/(c*c)))
- r = 1/sqrt(((c*c)/(s*s))-1)
- s = sin(π/p)
- c = cos(π/q)
B can be found by intersecting the ray A at angle π/p with the circle.
Reflection by Circle Inversion (3 & 4)
Once the radius of the fundamental region is calculated, the points of the fundamental polygon are easy to calculate. In Dunham’s paper on hyperbolic symmetry, he outlines an approach of calculating the fundamental region (the dark grey triangle) and replicating that across the hyperbolic plane. In his model, there are 3 reflections required to tile the entire plane. The first reflects across a line and creates a triangular segment of the fundamental polygon. This triangle is then reflected across the hypotenuse of the fundamental region repeatedly to fill in the fundamental polygon. The the third reflection is applied across the hyperbolic line to generate the other tiles.
Dunham is interested in tessellating patterns across the hyperbolic plane whereas I’m solely interested in drawing the polygons themselves and not any kind of pattern inside the polygons as found in M.C. Escher’s work. As a result, I can simplify Dunham’s approach a bit. First though, we need to understand circle inversion.
Inversion by a circle follows a simple procedure:
- Draw a ray from the center of the circle O to the point A that is to be inverted
- Calculate the inverted point A’ via length(OA) * length(OA’) = R^2
In other words, the process of inverting by a circle simply sets up a proportion of the distance to the point to the inverse distance of the inverted point where the proportions are related by the radius of the circle.
Going back to generating the fundamental polygon, my approach is to simply mark out every 2π/p radians a point the appropriate distance away from the center. This generates the entire polygon but discards Dunham’s internal reflections within the polygon, which I don’t carry about anyway.
The next step is to invert the polygon across each edge of the polygon following the procedure for circle inversion just outlined. Once this is done, one level of the tessellation will be completed. To continue the tessellation, simply repeat the inversion process across all remaining edges.