Check out the live demo at https://kwshi.github.io/thurston!
Riemann's mapping theorem states the following. Suppose π is a non-empty, proper open subset of β and that π is simply-connected, and let π§β,π§ββπ. Then there exists a unique biholomorphism π: πβπ» (where π» denotes the unit disk), with the property that π(π§β)=0, and π(π§β) lands on the positive-real axis.
Thurston's conjecture (also sometimes known as the discrete/finite Riemann mapping theorem) provides an insightful (and pretty!) construction/visualization of the Riemann mapping theorem, proceeding roughly as follows:
-
Given a (bounded) domain π, approximately triangulate π via a hexagonal circle-packing of radius π.
-
Carefully resize each circle to obtain a new packing with the same tangency structure that fits βmaximallyβ within the unit disk; i.e., boundary circles end up tangent to the boundary of the disk. This results in a mapping from circles in the original domain π to circles in π».
-
Map each triangle in π (as defined by the centers of three mutually-tangent circles) to the corresponding triangle in π» by a (uniquely-determined) affine map; gluing each piece together gives a map defined on the full triangulation.
-
Apply a (MΓΆbius) disk automorphism to send the image of π§β to 0, and rotate the image of π§β onto the real axis.
-
As π tends to zero, the map constructed in this manner gradually tends to the Riemann map π: πβπ».
This app is an interactive demonstration of this process. Check it out here: https://kwshi.github.io/thurston.
(Note: this list of references may be incomplete, because I haven't had the time to properly document each component of this app.)
-
Most of the mathematical content/know-how for this project came from taking Terry Tao's complex analysis course at UCLA (Math 246C, spring 2023) in the unit on circle-packings and quasiconformal maps. In fact, this project was created as an assigned final project for this course. Notes for this subject are publicly available on Terry Tao's blog.
-
The hexagonal circle-fitting algorithm (where, given an arbitrary polygon, the interior circle-packing/triangulation is computed) is a customization of the ray-casting algorithm used to solve the point in polygon problem.
-
The circle-packing algorithm is a simplified version of Collins & Stephenson's original algorithm based on local relaxation of radii and a "uniform neighbor model". Stephenson has a working Java implementation of this algorithm posted on his website; it contains many more in-depth explorations focused on circle packings.
-
Some inspiration for this project came from Beeker & Loustau's implementation of a similar app using C++ and Qt. In particular, this screenshot of their app looked really cool, and I wanted to recreate it, but I was dismayed to find that all of the download/installation links on their website were broken (at least, when I last checked), and I couldn't get their program to compile correctly. Plus, I figured, a version that runs on the web would ultimately end up being more accessible than a version that requires downloading and installing.
This project is incomplete! I'm still working on polishing it, adding features, etc. If you have any suggestions, please feel free to create a GitHub issue.