Contents

Hyperbolic Geometry Artwork
Hyperbolic geometry can be very beautiful. Hyperbolic tilings are not technically fractals, but they appear as fractals when you look at them (because they must be projected into Euclidean space).
(12,4) Poincaré Ball  POVRay 3.6.1, 5/27/11
The Poincaré ball is the 3D analogy of the Poincaré disk. It is a projection of uniformly tiled hyperbolic polyhedrons from hyperbolic space into Euclidean space. This projection can be generated by recursively applying spherical inversions to the faces of a sphairahedron (a polyhedron with spherical faces). This is a (12,4) Poincaré ball, meaning that is was generated from a hyperbolic dodecahedron having 12 faces with 4 dodecahedrons meeting at each edge. You can purchase this as a poster here.

(7,3) Poincaré Hyperbolic Tiling  AutoLisp, POVRay 3.6.1, 4/28/11
These are (7,3) Poincaré hyperbolic tilings, meaning that each tile is a 7sided polygon, and 3 polygons meet at each vertex. In real life (that is to say, in Euclidean space), it would be impossible to cover a plane with 7sided polygons, but in hyperbolic space this is possible. These tilings were generated using a series of reflections called antihomographies. I learned about homographies while participating at the Experimental Geometry Lab at the University of Maryland. Here is some Mathematica code:
(* runtime: 2 seconds *)
n = 7; m = 3; dt = 2Pi/n; dtm = 2Pi/m;r = 1.0/(1  Sin[dt/2]/Cos[dtm/2]); R = r Cos[(dt + dtm)/2]/Cos[dtm/2];
ToMatrix[z_, r_] := (I/r) {{z, r^2  z Conjugate[z]}, {1, Conjugate[z]}};
alist = Table[ToMatrix[r Exp[I t],r  1], {t, dt/2, 2 Pi, dt}]; Tlist = Join[{IdentityMatrix[2]}, alist];
homography[{{a_, b_}, {c_, d_}}, z_] := (a z + b)/(c z + d);
FindT[T0_, Tlist_] := MemberQ[Tlist, T_ /; Abs[homography[T, 0]  homography[T0, 0]] < 1.0*^3];
i2 = 1; Do[i1 = i2 + 1; i2 = Length[Tlist]; Do[Scan[(T = Tlist[[i]].#; If[! FindT[T, Tlist], Tlist = Append[Tlist, T]]) &, alist], {i,i1, i2}], {3}];
Show[Graphics[Map[Line[Table[z = homography[#, R Exp[I t]]; {Re[z], Im[z]}, {t, 0, 2 Pi, dt}]] &, Tlist], AspectRatio > Automatic]]
The left image uses a knotted surface pattern that was inspired after Bathsheba Grossman’s beautiful Quin Pendant Lamp, with permission from Bathsheba. Knotted surfaces like this can be extended to cover all kinds of arbitrary surfaces.

Hyperbolic tilings can also be visualized using circles. The left picture shows the (7,3) Poincaré hyperbolic tiling rendered using bubbles (an idea which Roger Bagula suggested to me). This is only possible using tilings with 3 polygons meeting at each vertex because bubble intersections must always meet at exactly 120° angles. Here is some Mathematica code to make a Poincaré tiling of tangent circles (you must run the above code before you can run this code):
(* runtime: 3 seconds *)
abs[z_] := Sqrt[z Conjugate[z]];
ReflectCircle[T_, {z_, r_}] := Module[{z1 = homography[T, z + r], z2 =homography[T, z + I r], z3 = homography[T, z  r], z0, r0}, {z0, r0} /. Solve[{abs[z1  z0] == abs[z2  z0] == abs[z3  z0] == r0}, {r0, z0}][[1]]];
Show[Graphics[Map[({z, r} = ReflectCircle[#, {0, 1}]; Circle[{Re[z], Im[z]}, r]) &, Tlist], AspectRatio > Automatic]]

I am selling mousepads using these designs here. Please email me if you are interested in purchasing this design on other formats (rugs, door mats, placemats, handbags, etc.)

Conformal Mappings of the Poincaré (7,3) Hyperbolic Tiling  AutoLisp, POVRay 3.6.1, 5/10/11
There are many ways to distort an image, but conformal mapping is the only method that preserves angles. Poincaré disks are especially great for conformal mapping, because they represent a conformal projection from hyperbolic space to Euclidean space. Here are some examples of conformal mappings to multicurl (or "murl" as described by Zueuk), rings, squares, regular polygons, and hearts. The images with a knotted surface pattern were inspired after Bathsheba Grossman’s beautiful Quin Pendant Lamp. See also my recursive Poincaré fractal.
Conformal Mapping Links
Ringworld  French article on hyperbolic ring tilings, by Jos Leys, see also his gallery
Sporogenesis, Blooming  beautiful multicurl Poincaré tessellations, by Zueuk
SchwarzChristoffel Mapping  method for mapping arbitray shapes
Conformal map for regular polygon in circle  Physics Forums discussion
Peirce's Quincuncial Map  maps to a square
Kaleidoscopes  includes some hexagon and square mappings of the Poincaré disk, by Vladimir Bulatov, see also his Google+ posts
Smarties: Pointy Heart  by Gadl

Conformal Mappings of the Poincaré (6,4) Hyperbolic Tiling  C#, 5/16/11
Hyperbolic Dodecahedron  POVRay 3.6.1, 2/15/07
Inside the Mirrored Hyperbolic Dodecahedron  POVRay 3.6.1, 2/15/07
This is what the dodecahedron would look like viewed from the inside with spherical mirrored walls. At certain dihedral angles, this resembles the inside of the Poincaré ball (although not exactly). Notice that when the space becomes elliptic, a black “hole” opens up in the center. This is because the space loops around on itself causing objects beyond the “maximum distance” to appear larger because they are actually closer. Weird huh?
Links
Hyperbolic Chamber  explantion and visuals Legos, by Jos Leys
Platonic Solids Kaleidoscope  by Laszlo Bardos

Inside the Mirrored Flat (Euclidean) Dodecahedron  POVRay 3.6.1, 2/12/07
Breather Pseudosphere  new version: POVRay 3.6.1, 6/21/06
old version: Mathematica 4.2, MathGL3d, POVRay 3.6.1, 9/30/04
A sphere is an elliptic surface with constant positive curvature. A pseudosphere is a hyperbolic surface with constant negative curvature. This pseudosphere is called a Breather. The animation shows how the surface changes from Kuen's surface into a breather with many ribs when the parameter is changed. Click here to download some POVRay code for this image and here for some AutoLisp code. Here is some Mathematica code:
(* runtime: 6 seconds *)
a = 0.498888; vmax = 47.1232; w = Sqrt[1  a^2];
Breather[u_, v_] := Module[{d = a((w Cosh[a u])^2 + (a Sin[w v])^2)}, x = u + 2w^2 Cosh[a u]Sinh[a u]/d; y = 2w Cosh[a u](w Cos[v]Cos[w v]  Sin[v]Sin[w v])/d; z = 2w Cosh[a u](w Sin[v]Cos[w v] +Cos[v]Sin[w v])/d; {x, y, z, {EdgeForm[], SurfaceColor[Hue[v/vmax]]}}];
ParametricPlot3D[Breather[u, v], {u, 10, 10}, {v, 0, vmax}, PlotPoints > {49, 79}, Compiled > False]
Links
Virtual Math Museum  beautiful rendition of this surface by Luc Benard, winning entry on cover of Science Magazine’s 2006 Visualization Challenge
POVRay Code  by Mike Williams, param.inc
Cooling Air Towers  also have a hyperbolic shape

Poincaré Hyperbolic Tessellation  AutoCAD 2000, AutoLisp, C#, Adobe Photoshop 5.0, 5/24/11
Technically, it is impossible to map a regular Euclidean tiling to the hyperbolic plane but it can still be done with some distortion. This (6,4) tiling of my Dinosaur tessellation was conformally mapped from a hexagon to a hyperbolic hexagon using a Hypergeometric function.

(3,∞) Poincaré Hyperbolic Tiling  Mathematica 4.2, 3/17/05
The area inside this circle represents a hyperbolic plane filled with “ideal triangles”. Notice that all the angles inside these triangles go to zero at the edge of the circle. The right animation shows how a single homography can transform the upper half plane into the Poincaré disk.
Links
Reducing Lizards  upper half plane tessellation by M.C. Escher

Hyperbolic Texture Mapping  left image: C#, POVRay 3.6.1, 6/21/11; right image: Mathematica 4.2, C++, 6/22/05
The Poincaré hyperbolic disk can be conformally mapped to the surface of a sphere. In this mapping, it almost looks like circles are preserved, but not quite. This makes me wonder whether it is possible to conformally map Poincaré disks onto other 3D surfaces. In the left image, the texture was precomputed using forward transformations (this is called the “push forward” method), and then it was mapped to the sphere. In the right image, the the texture was simultaneously calculated using inverse transformations (this is called the “pull back” method) while the sphere was being ray traced. Click here to download a Mathematica notebook for this image. Also, here is some C++ source code for this image.

(3,∞) Poincaré Hyperbolic Tiling  POVRay 3.6.1, 6/22/05
Click here to download some POVRay code for this image. Here is some Mathematica code:
(* runtime: 0.02 second *)
R = Sqrt[3]; Tiles = {Map[1.0 I{{#, R^2  # Conjugate[#]}, {1, Conjugate[#]}}/R &, {R + I, R + I, 2I}]};
Tiles = Append[Tiles, Flatten[Table[Map[Tiles[[1, i]].Conjugate[Tiles[[1, #]]].Tiles[[1, i]] &, DeleteCases[{1, 2, 3}, i]], {i, 1, 3}], 1]];
Do[Tiles = Append[Tiles, Flatten[Table[Map[Tiles[[g, i]].Conjugate[#].Tiles[[g, i]] &, {Tiles[[g  1, Ceiling[i/2]]], Tiles[[g, 2Ceiling[i/2]  Mod[i + 1,2]]]}], {i, 1, 3×2^(g  1)}], 1]], {g, 2, 5}];
Tiles = Flatten[Tiles, 1]; n = Length[Tiles];
ToDisk[{{a_, b_}, {c_, d_}}] := Disk[{Re[a/c], Im[a/c]}, Abs[I/c]];
Show[Graphics[{Hue[0], Disk[{0, 0}, 1], Table[{Hue[Sqrt[i/n]], ToDisk[Tiles[[i]]]}, {i,1, n}]}, AspectRatio > 1, PlotRange > {{1, 1}, {1, 1}}]]

Hyperboloid  POVRay 3.6.1, 6/22/05
Click here to download some POVRay code for this image. You can also make hyperboloids quickly in POVRay using the quadric command:
camera{location <0,10,0> look_at <0,0,0>}
light_source{<0,10,0>,1}
quadric{<1,1,1>,<0,0,0>,<0,0,0>,1 pigment{rgb 1}}
Link: Gallery of Algebraic Surfaces  by Xiao Gang

3,4,5 QuasiHomogeneous Domain  C++ version: 8/24/06, Mathematica version: 8/22/06
This was adapted from Anton Lukyanenko’s C++ code. Here is some Mathematica code:
(* runtime: 0.2 second *)
p = 3; q = 4; r = 5; d = 1.0; s = Sin[Pi/p]; c = Cos[Pi/p]; s2 = Sin[2Pi/p];c2 = Cos[2Pi/p];
p = Inverse[{{s, c  d, s d}, {s, 3 (c  d), s d}, {(3 + 4 c d) s,3 c  (1 + 2 c2) d, s d}}].{1, 2Cos[2Pi/q], 2Cos[2Pi/r] + 1};
R1 = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}; R2 = {{c2, s2, 0}, {s2, c2, 0}, {0, 0, 1}}; T = {{d, c, p[[1]]}, {0, s, p[[2]]}, {1, 1, p[[3]]}}; R3 = T.{{1, 0, 0}, {0, 1,0}, {0, 0, 1}}.Inverse[T];
Reflect[tile_, R_] := R.# & /@ tile; Children[tile_] := Reflect[tile, #] & /@ {R1, R2, R3};
tiles = {{{0, 0, 1}, {d, 0, 1}, {c, s, 1}}}; Do[tiles = Flatten[Children /@ tiles, 1], {7}];
Show[Graphics[Table[Polygon[Map[{#[[1]], #[[2]]}/#[[3]] &, tiles[[i]]]], {i, 1, Length[tiles]}], AspectRatio > 1]]
Links
Anton Lukyanenko’s Google+ posts

