half_translation_surfaces#

The category of half-translation surfaces.

A half-translation surface is a surface built by gluing Euclidean polygons. The sides of the polygons can be glued with translations or half-translations (translation followed by a rotation of angle π.)

See flatsurf.geometry.categories for a general description of the category framework in sage-flatsurf.

Normally, you won’t create this (or any other) category directly. The correct category is automatically determined for immutable surfaces.

EXAMPLES:

We glue all the sides of a square to themselves. Since each gluing is just a rotation of π, this is a half-translation surface:

sage: from flatsurf import Polygon, similarity_surfaces
sage: P = Polygon(vertices=[(0,0), (1,0), (1,1), (0,1)])
sage: S = similarity_surfaces.self_glued_polygon(P)
sage: S.set_immutable()

sage: C = S.category()

sage: from flatsurf.geometry.categories import HalfTranslationSurfaces
sage: C.is_subcategory(HalfTranslationSurfaces())
True
class flatsurf.geometry.categories.half_translation_surfaces.HalfTranslationSurfaces[source]#

The category of surfaces built by gluing (Euclidean) polygons with translations and half-translations (translations followed by rotations among an angle π.)

EXAMPLES:

sage: from flatsurf.geometry.categories import HalfTranslationSurfaces
sage: HalfTranslationSurfaces()
Category of half translation surfaces
class Orientable(base_category)[source]#

The category of orientable half-translation surfaces.

EXAMPLES:

sage: from flatsurf import polygons, similarity_surfaces
sage: B = similarity_surfaces.billiard(polygons.triangle(1, 2, 5))
sage: H = B.minimal_cover(cover_type="half-translation")

sage: from flatsurf.geometry.categories import HalfTranslationSurfaces
sage: H in HalfTranslationSurfaces().Orientable()
True
class WithoutBoundary(base_category)[source]#

The category of orientable half-translation surfaces without boundary.

EXAMPLES:

sage: from flatsurf import polygons, similarity_surfaces
sage: B = similarity_surfaces.billiard(polygons.triangle(1, 2, 5))
sage: H = B.minimal_cover(cover_type="half-translation")

sage: from flatsurf.geometry.categories import HalfTranslationSurfaces
sage: H in HalfTranslationSurfaces().Orientable().WithoutBoundary()
True
class ParentMethods[source]#

Provides methods available to all orientable half-translation surfaces.

If you want to add functionality for such surfaces you most likely want to put it here.

stratum()[source]#

EXAMPLES:

sage: from flatsurf import polygons, similarity_surfaces
sage: B = similarity_surfaces.billiard(polygons.triangle(1, 2, 5))
sage: H = B.minimal_cover(cover_type="half-translation")
sage: H.stratum()
Q_1(3, -1^3)
class Oriented(base_category)[source]#

The category of oriented half-translation surfaces, i.e., orientable half-translation surfaces which can be oriented in a way compatible with the embedding of their polygons in the real plane.

EXAMPLES:

sage: from flatsurf import polygons, similarity_surfaces
sage: B = similarity_surfaces.billiard(polygons.triangle(1, 2, 5))
sage: H = B.minimal_cover(cover_type="half-translation")

sage: from flatsurf.geometry.categories import HalfTranslationSurfaces
sage: H in HalfTranslationSurfaces().Oriented()
True
class FiniteType(base_category)[source]#

The category of oriented half-translation surfaces built from finitely many polygons.

EXAMPLES:

sage: from flatsurf import polygons, similarity_surfaces
sage: B = similarity_surfaces.billiard(polygons.triangle(1, 2, 5))
sage: H = B.minimal_cover(cover_type="half-translation")

sage: from flatsurf.geometry.categories import HalfTranslationSurfaces
sage: H in HalfTranslationSurfaces().Oriented().FiniteType()
True
class ParentMethods[source]#

Provides methods available to all oriented half-translation surfaces built from finitely many polygons.

If you want to add functionality for such surfaces you most likely want to put it here.

normalized_coordinates()[source]#

Return a pair (new_surface, matrix) where new_surface is defined over the holonomy field and matrix is the transition matrix that maps this surface to new_surface.

EXAMPLES:

sage: from flatsurf import translation_surfaces, polygons, similarity_surfaces

sage: S = translation_surfaces.veech_2n_gon(5)
sage: U, mat = S.normalized_coordinates()
sage: U.base_ring()
Number Field in a0 with defining polynomial x^2 - x - 1 with a0 = ...
sage: mat
[             0 -2/5*a^3 + 2*a]
[            -1 -3/5*a^3 + 2*a]

sage: T = translation_surfaces.torus((1, AA(2).sqrt()), (AA(3).sqrt(), 3))
sage: U, mat = T.normalized_coordinates()
sage: U.base_ring()
Rational Field
sage: U.holonomy_field()
Rational Field
sage: mat
[-2.568914100752347?  1.816496580927726?]
[-5.449489742783178?  3.146264369941973?]
sage: TestSuite(U).run()

sage: T = polygons.triangle(1,6,11)
sage: S = similarity_surfaces.billiard(T)
sage: S = S.minimal_cover("translation")
sage: U, _ = S.normalized_coordinates()
sage: U.base_ring()
Number Field in c0 with defining polynomial x^3 - 3*x - 1 with c0 = 1.879385241571817?
sage: U.holonomy_field() == U.base_ring()
True
sage: S.base_ring()
Number Field in c with defining polynomial x^6 - 6*x^4 + 9*x^2 - 3 with c = 1.969615506024417?
sage: TestSuite(U).run()

sage: from flatsurf import EuclideanPolygonsWithAngles
sage: polygons = EuclideanPolygonsWithAngles((1, 3, 1, 1))
sage: p = polygons.an_element()
sage: B = similarity_surfaces.billiard(p)
sage: B.minimal_cover("translation")
Minimal Translation Cover of Genus 0 Rational Cone Surface built from 2 equilateral triangles
sage: S = B.minimal_cover("translation")
sage: S, _ = S.normalized_coordinates()
sage: S
Translation Surface in H_1(0^6) built from 6 right triangles
class WithoutBoundary(base_category)[source]#

The category of oriented half-translation surfaces without boundary built from finitely many polygons.

EXAMPLES:

sage: from flatsurf import polygons, similarity_surfaces
sage: B = similarity_surfaces.billiard(polygons.triangle(1, 2, 5))
sage: H = B.minimal_cover(cover_type="half-translation")

sage: from flatsurf.geometry.categories import HalfTranslationSurfaces
sage: H in HalfTranslationSurfaces().Oriented().FiniteType().WithoutBoundary()
True
class ParentMethods[source]#

Provides methods available to all oriented half-translation surfaces without boundary built from finitely many polygons.

If you want to add functionality for such surfaces you most likely want to put it here.

angles(numerical=False, return_adjacent_edges=False)[source]#

Return the set of angles around the vertices of the surface.

These are given as multiple of 2 pi.

EXAMPLES:

sage: import flatsurf.geometry.similarity_surface_generators as sfg
sage: sfg.translation_surfaces.regular_octagon().angles()
[3]
sage: S = sfg.translation_surfaces.veech_2n_gon(5)
sage: S.angles()
[2, 2]
sage: S.angles(numerical=True)
[2.0, 2.0]
sage: S.angles(return_adjacent_edges=True) # random output
[(2, [(0, 1), (0, 5), (0, 9), (0, 3), (0, 7)]),
 (2, [(0, 0), (0, 4), (0, 8), (0, 2), (0, 6)])]
sage: S.angles(numerical=True, return_adjacent_edges=True) # random output
[(2.0, [(0, 1), (0, 5), (0, 9), (0, 3), (0, 7)]),
 (2.0, [(0, 0), (0, 4), (0, 8), (0, 2), (0, 6)])]

sage: sfg.translation_surfaces.veech_2n_gon(6).angles()
[5]
sage: sfg.translation_surfaces.veech_double_n_gon(5).angles()
[3]
sage: sfg.translation_surfaces.cathedral(1, 1).angles()
[3, 3, 3]

sage: from flatsurf import polygons, similarity_surfaces
sage: B = similarity_surfaces.billiard(polygons.triangle(1, 2, 5))
sage: H = B.minimal_cover(cover_type="half-translation")
sage: S = B.minimal_cover(cover_type="translation")
sage: H.angles()
[1/2, 5/2, 1/2, 1/2]
sage: S.angles()
[1, 5, 1, 1]

sage: H.angles(return_adjacent_edges=True)
 [(1/2, [...]), (5/2, [...]), (1/2, [...]), (1/2, [...])]
sage: S.angles(return_adjacent_edges=True)
 [(1, [...]), (5, [...]), (1, [...]), (1, [...])]

For self-glued edges, no angle is reported for the “vertex” at the midpoint of the edge:

sage: from flatsurf import Polygon, similarity_surfaces
sage: P = Polygon(vertices=[(0,0), (2,0), (1,4), (0,5)])
sage: S = similarity_surfaces.self_glued_polygon(P)
sage: S.angles()
[1]

Non-convex examples:

sage: from flatsurf import Polygon, MutableOrientedSimilaritySurface
sage: S = MutableOrientedSimilaritySurface(QQ)
sage: L = Polygon(vertices=[(0,0),(1,0),(2,0),(2,1),(1,1),(1,2),(0,2),(0,1)])
sage: S.add_polygon(L)
0
sage: S.glue((0, 0), (0, 5))
sage: S.glue((0, 1), (0, 3))
sage: S.glue((0, 2), (0, 7))
sage: S.glue((0, 4), (0, 6))
sage: S.set_immutable()
sage: S.angles()
[3]

sage: S = MutableOrientedSimilaritySurface(QQ)
sage: P = Polygon(vertices=[(0,0),(1,0),(2,0),(2,1),(3,1),(3,2),(2,2),(1,2),(1,1),(0,1)])
sage: S.add_polygon(P)
0
sage: S.glue((0, 0), (0, 8))
sage: S.glue((0, 1), (0, 6))
sage: S.glue((0, 2), (0, 9))
sage: S.glue((0, 3), (0, 5))
sage: S.glue((0, 4), (0, 7))
sage: S.set_immutable()
sage: S.angles()
[2, 2]
class ParentMethods[source]#

Provides methods available to all oriented half-translation surfaces.

If you want to add functionality for such surfaces you most likely want to put it here.

holonomy_field()[source]#

Return the relative holonomy field of this translation or half-translation surface.

EXAMPLES:

sage: from flatsurf import translation_surfaces, polygons, similarity_surfaces

sage: S = translation_surfaces.veech_2n_gon(5)
sage: S.holonomy_field()
Number Field in a0 with defining polynomial x^2 - x - 1 with a0 = ...
sage: S.base_ring()
Number Field in a with defining polynomial y^4 - 5*y^2 + 5 with a = 1.175570504584947?

sage: T = translation_surfaces.torus((1, AA(2).sqrt()), (AA(3).sqrt(), 3))
sage: T.holonomy_field()
Rational Field

sage: T = polygons.triangle(1,6,11)
sage: S = similarity_surfaces.billiard(T)
sage: S = S.minimal_cover("translation")
sage: S.base_ring()
Number Field in c with defining polynomial x^6 - 6*x^4 + 9*x^2 - 3 with c = 1.969615506024417?
sage: S.holonomy_field()
Number Field in c0 with defining polynomial x^3 - 3*x - 1 with c0 = 1.879385241571817?
class ParentMethods[source]#

Provides methods available to all half-translation surfaces.

If you want to add functionality for such surfaces you most likely want to put it here.

is_translation_surface(positive=True)[source]#

Return whether this surface is a (half-)translation surface.

This overrides similarity_surfaces.SimilaritySurfaces.ParentMethods.is_translation_surface().

EXAMPLES:

sage: from flatsurf import polygons, similarity_surfaces
sage: B = similarity_surfaces.billiard(polygons.triangle(1, 2, 5))
sage: H = B.minimal_cover(cover_type="half-translation")

sage: H.is_translation_surface(positive=False)
True
sage: H.is_translation_surface(positive=True)
False
Positive#

alias of TranslationSurfaces

super_categories()[source]#

Return the categories that a half-translation surface is always a member of.

EXAMPLES:

sage: from flatsurf.geometry.categories import HalfTranslationSurfaces
sage: HalfTranslationSurfaces().super_categories()
[Category of dilation surfaces, Category of rational cone surfaces]