6
$\begingroup$

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}]

enter image description here

$\endgroup$
1
  • 5
    $\begingroup$ 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? $\endgroup$ Commented Mar 7, 2021 at 20:48

2 Answers 2

4
$\begingroup$

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"]

enter image description here

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

enter image description here

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"]

enter image description here

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"]

enter image description here

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"]

enter image description here

Adding the option ViewPoint -> Top we get

enter image description here

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

enter image description here

$\endgroup$
1
  • $\begingroup$ 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. $\endgroup$ Commented Mar 9, 2021 at 1:00
2
$\begingroup$

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];
   B = PadRight[AngleVector[k*(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]

enter image description here

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];
   B = PadRight[AngleVector[k*(2 π)/n], 3];
   M = Mean[{A, B}];
   ParametricPlot3D[{0, 0, 0} + 
     t*(M + Cos[θ]*(A - M) + 
        Sin[θ]*Norm[A - M]*(-1)^k*{0, 0, 1}), {θ, 
     0, π}, {t, 0, 1}, MeshFunctions -> (#4 &), 
    ColorFunction -> (ColorData["Rainbow"][Norm@{#1, #2}] &), 
    ColorFunctionScaling -> False]];
Show[semicone /@ Range[n], PlotRange -> All, Boxed -> False, 
 Axes -> False]

enter image description here

$\endgroup$
1
  • $\begingroup$ I want to take a regular polygon which has been distorted through these semicones and then tile the hyperbolic plane with it. I want to produce a graphic of this as well. There are various built in functions in Mathematica that have been used for this and are covered in questions in stackexchange, such as how to create a kaleidoscope, and there are wolfram demonstrations which produce regular polygon tilings of the hyperbolic plane and display these graphically. I want to take one of these surfaces like the one you've constructed or the one I constructed and embed it. $\endgroup$ Commented Mar 8, 2021 at 22:05

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.