====== Tutorial on hyperbolic surfaces ====== A //hyperbolic surface with cusps// is a topological surface together with a hyperbolic structure of finite area. ''%%polymake%%'' can deal with hyperbolic surfaces in view of Penners coordinates of the decorated Teichmüller space (lambda lengths). These allow to pick a hyperbolic surface by choosing a triangulation of the surface along with one positive parameter for each edge. The [[https://arxiv.org/abs/1708.08714v1|secondary fan]] of a hyperbolic surface stratifies the space of weight vectors (horocyclic decorations) according to which Delaunay triangulations are induced by the Epstein-Penner convex hull construction. For each point on the surface, there is a [[https://arxiv.org/abs/1708.08714v1|secondary polyhedron]] whose normal fan is the secondary fan. This tutorial shows how to deal with secondary fans and secondary polyhedra of hyperbolic surfaces. ==== Construction of hyperbolic surfaces ==== To define a hyperbolic surface we need to specify (a) a triangulation and (b) Penner coordinates. (a) The triangulation is obtained by specifying the ''%%DCEL%%'' as an ''%%Matrix%%''. This constructs a doubly connected edge list as follows: Each row of the nput of ''%%DCEL%%'' reads { (//2i//).head , (//2i+1//).head , (//2i//).next , (//2i+1//).next }. In general, for each edge //i// of the triangulation there are two half edges //2i// and //2i+1//, one for each orientation. (b) The ''%%PENNER_COORDINATES%%'' assign a positive rational number to each edge of the triangulation, ordered in the same sense as prescribed by the ''%%DCEL%%''. ==== Example 1: hyperbolic sphere with three cusps ==== > application 'fan'; > application 'topaz'; > $S3 = new Matrix([[1,0,2,5],[2,1,4,1],[0,2,0,3]]); > $s = new HyperbolicSurface(DCEL=>$S3,PENNER_COORDINATES=>[1,1,1]); In this example the doubly connected edge list looks like this: ==== The secondary fan ==== The secondary fan of the hyperbolic sphere from above can now be computed as follows. > $f = $s->SECONDARY_FAN; > $f->properties; type: PolyhedralFan MAXIMAL_CONES {0 1 2} {0 1 3} {1 2 4} {0 2 5} RAYS 0 1 1 1 0 1 1 1 0 0 0 1 1 0 0 0 1 0 > $f->VISUAL; fan:
Explode
Automatic explosion
Exploding speed
Transparency
depthWrite
Rotation
x-axis
y-axis
z-axis
Rotation speed
Display
Objects
Camera
SVG
Download
New tab
> $s->properties; name: s type: HyperbolicSurface DCEL N_vertices: 3 Halfedges list: (edgeIndex: twinIndex nextIndex prevIndex headIndex) 0: 1 2 4 1 (0 ---> 1) 1: 0 5 3 0 (1 ---> 0) 2: 3 4 0 2 (1 ---> 2) 3: 2 1 5 1 (2 ---> 1) 4: 5 0 2 0 (2 ---> 0) 5: 4 3 1 2 (0 ---> 2) FLIP_WORDS {} {0} {1} {2} PENNER_COORDINATES 1 1 1 SECONDARY_FAN type: PolyhedralFan The ''%%FLIP_WORDS%%'' indicate how to obtain the Delaunay triangulations. The k-th flip word is a list of integers (the indices of the edges) that describe which edge flips produce the k-th Delaunay triangulation. Note that the k-th Delaunay triangulation also corresponds to the k-th maximal cone of the ''%%SECONDARY_FAN%%''. ==== GKZ vectors & secondary polyhedra ==== In order to compute ''%%GKZ_VECTORS%%'' or a ''%%secondary_polyhedron%%'' of a hyperbolic surface one needs to additionally specify a ''%%SPECIAL_POINT%%'' on the surface. This is done by choosing two rational numbers. Continuing with the above example, lets look at the following. > $s = new HyperbolicSurface(DCEL=>$S3,PENNER_COORDINATES=>[1,1,1],SPECIAL_POINT=>[1,0]); Now we may compute an approximation of the ''%%GKZ_VECTORS%%'' of the surface. The approximation depends on a parameter //depth// that restricts the depth of the (covering) triangles that are summed over in the definition of the GKZ vectors. > print $s->GKZ_VECTORS(3); 1 33346854621/25672050625 33346854621/25672050625 19782163/27238250 1 2361/3250 3955357/5447650 33346854621/25672050625 1 10549213550005124385885122/6365327663846199230365625 11433978/13287625 30327974429709/105771923977850 1 11433978/13287625 10549213550005124385885122/6365327663846199230365625 30327974429709/105771923977850 The secondary polyhedron can be computed similarly using the function ''%%secondary_polyhedron%%''. > $p = secondary_polyhedron($s,10); > $p->properties; name: p type: Polytope CONE_AMBIENT_DIM 4 VERTICES 1 1.315301353 1.315301353 0.7316378744 1 0.7316489581 0.7316267908 1.315301353 1 1.752046187 0.8750928112 0.2910011302 1 0.8750928112 1.752046187 0.2910011302 0 -1 0 0 0 0 -1 0 0 0 0 -1 VERTICES_IN_FACETS {0 1 3 4} {0 1 2 5} {0 2 3 6} {1 4 5} {2 5 6} {3 4 6} > $p->VISUAL(FacetColor=>'255 180 80'); p_bounded
Transparency
depthWrite
Rotation
x-axis
y-axis
z-axis
Rotation speed
Display
Objects
Camera
SVG
Download
New tab
We may look at the GKZ domes of the individual Delaunay triangulations. > $d0 = $s->gkz_dome(0,5); > $d0->VISUAL(FacetColor=>'80 180 255'); pcom:d0
Explode
Automatic explosion
Exploding speed
Transparency
depthWrite
Rotation
x-axis
y-axis
z-axis
Rotation speed
Display
Objects
Camera
SVG
Download
New tab
> $d1 = $s->gkz_dome(1,5); > $d1->VISUAL(FacetColor=>'80 180 255'); pcom:d1
Explode
Automatic explosion
Exploding speed
Transparency
depthWrite
Rotation
x-axis
y-axis
z-axis
Rotation speed
Display
Objects
Camera
SVG
Download
New tab
==== Example 2: a hyperbolic torus with three cusps ==== > $T3 = new Matrix([[1,0,2,17],[2,1,4,14],[0,2,0,6],[1,2,8,16],[0,1,5,10],[2,1,12,1],[0,2,9,3],[0,1,13,7],[0,2,15,11]]); > $s = new HyperbolicSurface(DCEL=>$T3, PENNER_COORDINATES=>[2,1,1,1,1,1,1,1,1], SPECIAL_POINT=>[1,0]); > $f = $s->SECONDARY_FAN; > $f->VISUAL; fan:
Explode
Automatic explosion
Exploding speed
Transparency
depthWrite
Rotation
x-axis
y-axis
z-axis
Rotation speed
Display
Objects
Camera
SVG
Download
New tab
> $s->properties; name: s type: HyperbolicSurface DCEL N_vertices: 3 Halfedges list: (edgeIndex: twinIndex nextIndex prevIndex headIndex) 0: 1 2 4 1 (0 ---> 1) 1: 0 17 11 0 (1 ---> 0) 2: 3 4 0 2 (1 ---> 2) 3: 2 14 13 1 (2 ---> 1) 4: 5 0 2 0 (2 ---> 0) 5: 4 6 8 2 (0 ---> 2) 6: 7 8 5 1 (2 ---> 1) 7: 6 16 15 2 (1 ---> 2) 8: 9 5 6 0 (1 ---> 0) 9: 8 10 12 1 (0 ---> 1) 10: 11 12 9 2 (1 ---> 2) 11: 10 1 17 1 (2 ---> 1) 12: 13 9 10 0 (2 ---> 0) 13: 12 3 14 2 (0 ---> 2) 14: 15 13 3 0 (1 ---> 0) 15: 14 7 16 1 (0 ---> 1) 16: 17 15 7 0 (2 ---> 0) 17: 16 11 1 2 (0 ---> 2) FLIP_WORDS {0} {} {0 3} {0 4 7} {0 6} {3} {6} {0 3 1 5} {0 6 2 8} {3 1 5} {6 2 8} {0 3 1 5 0 1} {0 6 2 8 0 2} PENNER_COORDINATES 2 1 1 1 1 1 1 1 1 SECONDARY_FAN type: PolyhedralFan SPECIAL_POINT 1 0 > $p = secondary_polyhedron($s,7); > $p->VISUAL(FacetColor=>'255 180 80'); p_bounded
Transparency
depthWrite
Rotation
x-axis
y-axis
z-axis
Rotation speed
Display
Objects
Camera
SVG
Download
New tab
> $d0 = $s->gkz_dome(0,5); > $d0->VISUAL(FacetColor=>'80 180 255'); pcom:d0
Explode
Automatic explosion
Exploding speed
Transparency
depthWrite
Rotation
x-axis
y-axis
z-axis
Rotation speed
Display
Objects
Camera
SVG
Download
New tab
> $s = new HyperbolicSurface(DCEL=>$T3, PENNER_COORDINATES=>[2,1,1,1,1,1,1,1,1], SPECIAL_POINT=>[new Rational(1.5196714),new Rational(-0.5773503)]); > $p = secondary_polyhedron($s,7); > $p->VISUAL(FacetColor=>'255 180 80'); p_bounded
Transparency
depthWrite
Rotation
x-axis
y-axis
z-axis
Rotation speed
Display
Objects
Camera
SVG
Download
New tab
> $d0 = $s->gkz_dome(0,5); > $d0->VISUAL(FacetColor=>'80 180 255'); pcom:d0
Explode
Automatic explosion
Exploding speed
Transparency
depthWrite
Rotation
x-axis
y-axis
z-axis
Rotation speed
Display
Objects
Camera
SVG
Download
New tab
==== More examples can be studied via the following: ==== > # a torus with two cusps (6 edges) > $T2 = new Matrix([[0,0,6,5],[0,0,1,10],[0,0,8,2],[1,0,11,4],[1,0,7,3],[1,0,9,0]]); > > # a sphere with four cusps (6 edges) > $S4 = new Matrix([[1,0,2,6],[2,1,4,9],[0,2,0,11],[3,0,8,5],[1,3,1,10],[2,3,3,7]]); > > # a double torus with two cusps (12 edges) > $DT2 = new Matrix([[0,0,8,10],[0,0,12,14],[0,0,16,18],[0,0,20,22],[1,0,23,2],[1,0,13,3],[1,0,9,1],[1,0,11,4],[1,0,15,6],[1,0,21,7],[1,0,17,5],[1,0,19,0]]); To study 4-dim. secondary fans the following method is useful. It intersects the secondary fan with the 3-dim. standard simplex. > sub norm($){ > my $B = new Matrix(shift); > for (my $i = 0; $i < $B->rows(); ++$i) { > my $sum = 0; > for (my $j = 1; $j < $B->cols(); ++$j) { > $sum = $sum + $B->elem($i,$j); > } > $x = 1/$sum; > $B->row($i) = $x * $B->row($i); > } > return $B; > } > $s = new HyperbolicSurface(DCEL=>$S4,PENNER_COORDINATES=>[1,1,1,1,1,1],SPECIAL_POINT=>[1,0]); > $f = $s->SECONDARY_FAN; > $v = ones_vector | $f->RAYS; > $a = norm($v); > $b = $a->minor(All,~[0]); > $c = ones_vector | $b; > $q = new fan::PolyhedralComplex(POINTS=>$c,INPUT_POLYTOPES=>rows($f->MAXIMAL_CONES)); > $pro = fan::project_full($q); > $pro->VISUAL; pcom:pro
Explode
Automatic explosion
Exploding speed
Transparency
depthWrite
Rotation
x-axis
y-axis
z-axis
Rotation speed
Display
Objects
Camera
SVG
Download
New tab