# Hyperbolic tiling of 3d objects

I have created a 3d object using plot3d and want to try and tile it hyperbolicly. It has a hexagonal cross section and it's the hexagons that I want to tile. Is there a way I can take an object and map it onto a hyperbolic plane?

Here is the code I used to create the object and an image of a render

You will notice that the edges of the hexagon alternate curving upwards and downwards. I know in a hyperbolic hexagonal tiling I can tile hexagons with alternating edges so that they match with the appropriate parity edge on an adjacent hexagon because you can fit more hexagons adjacently in the hyperbolic plane. That's why I can't just tile these objects in a euclidean plane because it won't be smoothly matched if some edges curve upwards and then are glued to edges curving downwards.

ParametricPlot3D[{
{u,(Tan[30 Degree])u Sin[theta],(Tan[30 Degree])u Cos[theta]},
{u Cos[-120 Degree]-(Tan[30 Degree])u Cos[theta] Sin[-120 Degree],
(Tan[30 Degree])u Sin[theta],
(Tan[30 Degree])u Cos[theta] Cos[-120 Degree]+Sin[-120 Degree] u},
{-u ,-(Tan[30 Degree]) u Sin[theta],
(Tan[30 Degree]) u Cos[theta] },
{-u  Cos[120 Degree]-(Tan[30 Degree]) u Cos[theta] Sin[120 Degree],
-(Tan[30 Degree]) u Sin[theta],
(Tan[30 Degree]) u Cos[theta]  Cos[120 Degree] +Sin[120 Degree] (-u)},
{-u Cos[-120 Degree]- (Tan[30 Degree]) u Cos[theta]  Sin[-120 Degree],
-(Tan[30 Degree]) u Sin[theta],
(Tan[30 Degree]) u Cos[theta] Cos[-120 Degree] + Sin[-120 Degree] (-u) },
{u Cos[120 Degree]-(Tan[30 Degree])u Cos[theta] Sin [120 Degree],
(Tan[30 Degree])u Sin[theta],
(Tan[30 Degree])u Cos[theta] Cos [120 Degree]+ u Sin[120 Degree]}},
{u,0,1},
{theta,0,Pi}]


• Nice plot, but you created a 2 dim surface not a 3 object. What do you mean by "hexagonal cross section"? A surface does not have a cross section. And what do you mean by hyperbolic tiling? And where are the hexagons? Commented Mar 7, 2021 at 20:48

With a slight modification of your list of 6 parametric functions, we get dips and bumps in the vertical direction:

flist = NestList[RotationTransform[Pi/3, {0, 0, 1}] @* ReflectionTransform[{0, 0, -1}],
{u Cos[theta] Tan[Pi/6], u, u Sin[theta] Tan[Pi/6]}, 5];

pp = ParametricPlot3D[Evaluate[flist], {u, 0, 1}, {theta, 0, Pi},
PlotStyle -> (Opacity[.9, #] & /@ {Red, Green, Blue, Orange, Magenta, Cyan}),
ImageSize -> Large, Boxed -> False, Axes -> False, Lighting -> "Ambient"]


Add the option ViewPoint -> {0, 0, ∞} to get

To get a tiling using the base surface, we can vertically flip and translate it. We can connect two copies of the basic surface through bumps or dips. Let's consider connecting them at bumps:

ParametricPlot3D[Evaluate[Join[flist,
{0, 2, 0} + {1, 1, -1} # & /@ list,
{-Sqrt[3], -1, 0} + {1, 1, -1} # & /@ flist,
{Sqrt[3], -1, 0} + {1, 1, -1} # & /@ flist]],
{u, 0, 1}, {theta, 0, Pi},
PlotStyle -> (Opacity[.9, #] & /@ {Red, Green, Blue, Orange, Magenta,  Cyan}),
ImageSize -> Large, Boxed -> False, Axes -> False, Lighting -> "Ambient"]


Note: We can get the same result using GeometricTransformations of pp. That is,

Show[pp, Table[MapAt[GeometricTransformation[#,
TranslationTransform[tr] @* ReflectionTransform[{0, 0, -1}]] &, pp, {1}],
{tr, {{0, 2, 0}, {-Sqrt[3], -1, 0}, {Sqrt[3], -1, 0}}}],
PlotRange -> All]


gives the same picture.

Inspecting the result we see that it is impossible to fill the remaining gaps with a translated copy of the base surface because the connecting surface should be composed of all dips.

dips = MapAt[-Abs@# &, flist, {All, -1}];

ParametricPlot3D[Evaluate[dips], {u, 0, 1}, {theta, 0, Pi},
PlotStyle -> (Darker /@ {Red, Green, Blue, Orange, Magenta, Cyan}),
ImageSize -> Large, Boxed -> False, Axes -> False, Lighting -> "Ambient"]


We can use this surface (appropriately translated) to fill the gaps in the tiling above:

ParametricPlot3D[Evaluate[Join[flist,
{0, 2, 0} + {1, 1, -1} # & /@ flist,
{-Sqrt[3], -1, 0} + {1, 1, -1} # & /@ flist,
{Sqrt[3], -1, 0} + {1, 1, -1} # & /@  flist,
{Sqrt[3], 1, 0} + # & /@ dips,
{0, -2, 0} + # & /@ dips,
{-Sqrt[3], 1, 0} + # & /@ dips]],
{u, 0, 1}, {theta, 0, Pi},
PlotStyle -> (Join[#, Darker /@ #] &@{Red, Green, Blue, Orange, Magenta, Cyan}),
ImageSize -> Large, Boxed -> False, Axes -> False, Lighting -> "Ambient"]


Adding the option ViewPoint -> Top we get

Using ViewPoint -> {0, 0, ∞} we get

• This is why I wanted to do it in the hyperbolic plane, because it's possible then to match up the bumps and dips because you can fit a larger number of hexagons into the same space. Commented Mar 9, 2021 at 1:00

Here is not an answer since I also don't know the meaning of hyperbolic tiling.

We post the simplified code which can deal with the general even number.

The motivation is as below.

n = 10;
semiconeline[k_] := Module[{A, B, M},
A = PadRight[AngleVector[(k - 1)*(2 π)/n], 3];
M = Mean[{A, B}];
ParametricPlot3D[
M + Cos[θ]*(A - M) +
Sin[θ]*Norm[A - M]*(-1)^k*{0, 0, 1}, {θ,
0, π}]];
Show[Graphics3D[{Point[{0, 0, 0}], Opacity[.9],
Polygon[PadRight[#, 3] & /@ CirclePoints[{1, 0}, n]]}],
semiconeline /@ Range[n], PlotRange -> All, Boxed -> False,
Axes -> False]


Now it it easy to generate the surface by extrude the origin to the space curve.

n = 10;
semicone[k_] := Module[{A, B, M},
A = PadRight[AngleVector[(k - 1)*(2 π)/n], 3];