Transform point in the Poincaré disc to point in tile I have a set of image files that I want to use to use to texture a set of tiles with (one image per tile), in order to render a textured version of the Poincaré disc with a specific tiling by using computer graphics. (The result will be similar to M. C. Escher's Circle Limit III, which is basically just a "quadratic" tile and a "triangular" tile that are repeated infinitely many times.) For each point in the disc that needs to be rendered, I need to know the following two things:

*

*Which of the tiles covers that point, and


*What point on the tile the point on the disc corresponds to.
I need to know both these things to be able to both find the correct image file, as well as the correct point (pixel) in that image, in order to find the correct color to put on the point in the disc. So how can I find out these two things?
 A: I wrote my PhD thesis on the creation of hyperbolic ornaments like the one you describe. There might be various things on there that could be of use to you.

*

*Which tile covers which point?
I've picked a single polygonal tile at the center as the canonical tile, and described all other tiles as copies of that. A tile can be modelled as the intersection of half planes, where a half plane is essentially an oriented line. So if you can describe a bunch of lines and check whether a given point is on the left of all of them, that's enough to decide whethera point is inside a convex polygon defined by these lines.
To decide which tile a given point is in, I can suggest essentially two approaches. One is generating times then checking them one after the other. The other approach goes the reverse direction: as long as the point lies outside your canonical tile, you apply one of the elements of your symmetry group to it in order to get an element from the same orbit which lies closer to the canonical tile. Eventually you should get a point that actually lies inside the canonical tile. If you keep track of the transformations you applied to get from original to final position, you can use these as a description of the tile your started in.
In both these approaches you have to deal with the problem that different elements of your symmetry group can be described as different combinations of group generators. In the first approach you need to tackle this in order to avoid generating the same tile twice, while in the second approach you need it to be able to tell whether two points are part of the same tile. In my thesis I'm discussing at length how to do this for symmetry groups that consist of reflections in the sides of a triangle. This can then also be used for subgroups of such a reflection group, which cover a lot of reasonably regular tilings.
If all you want is a picture, you don't really need to keep track of the steps that transformed the initial point to a corresponding point of the same orbit in the canonical tile. I've written implementations that do the transformation to canonical tile in OpenGL without knowing which tile is which. So you might want to answer question 2 without being too fixed on assuming that question 1 is a necessary prerequisite to that.


*What's the point on the tile for my point in the disk?
This depends a lot on how you represent the picture content of the tile. I've way of doing that is by taking the canonical tile I described above, as a portion of the Poincaré disk, and having that covered by some pixel grid or some such. Then you can use the ”convert point coordinate to canonical tile“ approach above and call it done. This is very useful if you are doing a drawing application, where input and output is the hyperbolic disk and you just need some way to store a bit of color information.
If on the other hand the tile content comes from an external and non-hyperbolic source, e.g. an Euclidean ornament, then you need a transformation to make that even fit into the hyperbolic symmetry group. My thesis argues that a conformal map, approximated using methods of discrete conformality, can serve as an aesthetically pleasing transformation for this.
