lazy

Triangulations, Delaunay triangulations, and Delaunay decompositions of (possibly infinite) surfaces.

EXAMPLES:

Typically, you don’t need to create these surfaces directly, they are created by invoking methods on the underlying surfaces:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase()
sage: S.triangulate().codomain()
Triangulation of The infinite staircase

sage: S.delaunay_triangulate().codomain()
Delaunay triangulation of The infinite staircase

sage: S.delaunay_decompose().codomain()
Delaunay cell decomposition of The infinite staircase
class flatsurf.geometry.lazy.GL2RImageSurface(reference, m, category=None)[source]

The GL(2,R) image of an oriented similarity surface obtained by applying a matrix to each polygon while keeping the gluings intact.

EXAMPLE:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.octagon_and_squares()
sage: r = matrix(ZZ,[[0, 1], [1, 0]])
sage: SS = r * S

sage: S.canonicalize() == SS.canonicalize()
True
is_mutable()[source]

Return whether this surface is mutable, i.e., return False.

This implements flatsurf.geometry.categories.topological_surfaces.TopologicalSurfaces.ParentMethods.is_mutable().

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.octagon_and_squares()
sage: r = matrix(ZZ,[[0, 1], [1, 0]])
sage: S = r * S

sage: S.is_mutable()
False
is_triangulated(limit=None)[source]

Return whether this surface is triangulated.

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.octagon_and_squares()
sage: m = matrix(ZZ,[[0, 1], [1, 0]])
sage: (m * S).is_triangulated()
False
opposite_edge(label, edge)[source]

Return the polygon label and edge index when crossing over the edge of the polygon label.

This implements flatsurf.geometry.categories.polygonal_surfaces.PolygonalSurfaces.ParentMethods.opposite_edge().

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.octagon_and_squares()
sage: r = matrix(ZZ,[[0, 1], [1, 0]])
sage: S = r * S

sage: S.opposite_edge(0, 0)
(2, 0)
polygon(label)[source]

Return the polygon with label.

This implements flatsurf.geometry.categories.polygonal_surfaces.PolygonalSurfaces.ParentMethods.polygon().

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.octagon_and_squares()
sage: r = matrix(ZZ,[[0, 1], [1, 0]])
sage: S = r * S

sage: S.polygon(0)
Polygon(vertices=[(0, 0), (a, -a), (a + 2, -a), (2*a + 2, 0), (2*a + 2, 2), (a + 2, a + 2), (a, a + 2), (0, 2)])
class flatsurf.geometry.lazy.LazyDelaunaySurface(similarity_surface, direction=None, relabel=None, category=None)[source]

Delaunay cell decomposition of a (possibly infinite type) surface.

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase()
sage: m = matrix([[2, 1], [1, 1]])
sage: S = (m * S).delaunay_decompose().codomain()

sage: S.polygon(S.root())
Polygon(vertices=[(0, 0), (-1, 0), (-1, -1), (0, -1)])

sage: S.is_delaunay_decomposed()
True

sage: TestSuite(S).run()  # long time (2s)

sage: from flatsurf.geometry.lazy import LazyDelaunaySurface
sage: isinstance(S, LazyDelaunaySurface)
True
sage: from flatsurf.geometry.chamanara import chamanara_surface
sage: S = chamanara_surface(QQ(1/2))
sage: m = matrix([[3, 4], [-4, 3]]) * matrix([[4, 0],[0, 1/4]])
sage: S = (m * S).delaunay_decompose().codomain()
sage: S.is_delaunay_decomposed()
True

sage: TestSuite(S).run()  # long time (1.5s)

sage: from flatsurf.geometry.lazy import LazyDelaunaySurface
sage: isinstance(S, LazyDelaunaySurface)
True
is_compact()[source]

Return whether this surface is compact as a topological space.

This implements flatsurf.geometry.categories.topological_surfaces.TopologicalSurfaces.ParentMethods.is_compact().

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase().delaunay_decompose().codomain()
sage: S.is_compact()
False
is_delaunay_decomposed(limit=None)[source]

Return whether this surface is decomposed into Delaunay cells, which it naturally is.

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase()
sage: S.delaunay_decompose().codomain().is_delaunay_decomposed()
True
is_mutable()[source]

Return whether this surface is mutable, i.e., return False.

This implements flatsurf.geometry.categories.topological_surfaces.TopologicalSurfaces.ParentMethods.is_mutable().

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase().delaunay_decompose().codomain()
sage: S.is_mutable()
False
opposite_edge(label, edge)[source]

Return the polygon label and edge index when crossing over the edge of the polygon label.

This implements flatsurf.geometry.categories.polygonal_surfaces.PolygonalSurfaces.ParentMethods.opposite_edge().

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase().delaunay_decompose().codomain()
sage: S.opposite_edge((0, 0), 0)
((1, 1), 2)
polygon(label)[source]

Return the polygon with label.

This implements flatsurf.geometry.categories.polygonal_surfaces.PolygonalSurfaces.ParentMethods.polygon().

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase().delaunay_decompose().codomain()
sage: S.polygon((0, 0))
Polygon(vertices=[(0, 0), (1, 0), (1, 1), (0, 1)])
roots()[source]

Return root labels for the polygons forming the connected components of this surface.

This implements flatsurf.geometry.categories.polygonal_surfaces.PolygonalSurfaces.ParentMethods.roots().

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase().delaunay_decompose().codomain()
sage: S.roots()
((0, 0),)
class flatsurf.geometry.lazy.LazyDelaunayTriangulatedSurface(similarity_surface, direction=None, relabel=None, category=None)[source]

Delaunay triangulation of a (possibly infinite type) surface.

ALGORITHM:

Basically we just flip edges that violate the Delaunay condition until everything is Delaunay. The complication arises because the surface can be infinite. The strategy is therefore, to perform the flips such that more and more triangles do not contain any vertices in their circumscribed circle. These triangles are then actual triangles of the Delaunay triangulation.

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase().delaunay_triangulate().codomain()
sage: len(S.polygon(S.root()).vertices())
3
sage: TestSuite(S).run()  # long time (.8s)
sage: S.is_delaunay_triangulated()
True

sage: from flatsurf.geometry.lazy import LazyDelaunayTriangulatedSurface
sage: isinstance(S, LazyDelaunayTriangulatedSurface)
True
sage: from flatsurf.geometry.chamanara import chamanara_surface
sage: S = chamanara_surface(QQ(1/2))
sage: m = matrix([[2,1],[1,1]])**4
sage: S = (m*S).delaunay_triangulate().codomain()
sage: TestSuite(S).run()  # long time (1s)
sage: S.is_delaunay_triangulated()
True
sage: TestSuite(S).run()  # long time (.5s)

sage: from flatsurf.geometry.lazy import LazyDelaunayTriangulatedSurface
sage: isinstance(S, LazyDelaunayTriangulatedSurface)
True
is_compact()[source]

Return whether this surface is compact as a topological space.

This implements flatsurf.geometry.categories.topological_surfaces.TopologicalSurfaces.ParentMethods.is_compact().

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase().delaunay_triangulate().codomain()
sage: S.is_compact()
False
is_delaunay_triangulated(limit=None)[source]

Return whether this surface is Delaunay triangulated, which it naturally is.

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase().delaunay_triangulate().codomain()
sage: S.is_delaunay_triangulated()
True
is_mutable()[source]

Return whether this surface is mutable, i.e., return False.

This implements flatsurf.geometry.categories.topological_surfaces.TopologicalSurfaces.ParentMethods.is_mutable().

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase().delaunay_triangulate().codomain()
sage: S.is_mutable()
False
is_triangulated(limit=None)[source]

Return whether this surface is triangulated, which it naturally is.

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase().delaunay_triangulate().codomain()
sage: S.is_triangulated()
True
labels()[source]

Return the labels of this surface.

This implements flatsurf.geometry.categories.polygonal_surfaces.PolygonalSurfaces.ParentMethods.labels().

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase().delaunay_triangulate().codomain()
sage: S.labels()
((0, 0), (1, 1), (-1, 1), (0, 1), (1, 0), (2, 0), (-1, 0), (-2, 0), (2, 1), (3, 1), (-2, 1), (-3, 1), (3, 0), (4, 0), (-3, 0), (-4, 0), …)
opposite_edge(label, edge)[source]

Return the polygon label and edge index when crossing over the edge of the polygon label.

This implements flatsurf.geometry.categories.polygonal_surfaces.PolygonalSurfaces.ParentMethods.opposite_edge().

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase().delaunay_triangulate().codomain()
sage: S.opposite_edge((0, 0), 0)
((1, 1), 1)
polygon(label)[source]

Return the polygon with label.

This implements flatsurf.geometry.categories.polygonal_surfaces.PolygonalSurfaces.ParentMethods.polygon().

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase().delaunay_triangulate().codomain()
sage: S.polygon((0, 0))
Polygon(vertices=[(0, 0), (1, 0), (1, 1)])
roots()[source]

Return root labels for the polygons forming the connected components of this surface.

This implements flatsurf.geometry.categories.polygonal_surfaces.PolygonalSurfaces.ParentMethods.roots().

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase().delaunay_triangulate().codomain()
sage: S.roots()
((0, 0),)
class flatsurf.geometry.lazy.LazyMutableOrientedSimilaritySurface(surface, category=None)[source]

A helper surface for LazyDelaunayTriangulatedSurface.

A mutable wrapper of an (infinite) reference surface. When a polygon is not present in this wrapper yet, it is taken from the reference surface and can then be modified.

Note

This surface does not implement the entire surface interface correctly. It just supports the operations in the way that they are necessary to make LazyDelaunayTriangulatedSurface work.

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase()

sage: from flatsurf.geometry.lazy import LazyMutableOrientedSimilaritySurface
sage: T = LazyMutableOrientedSimilaritySurface(S)
sage: p = T.polygon(0)
sage: p
Polygon(vertices=[(0, 0), (1, 0), (1, 1), (0, 1)])
sage: q = p * 2

sage: S.replace_polygon(0, q)
Traceback (most recent call last):
...
AttributeError: '_InfiniteStaircase_with_category' object has no attribute 'replace_polygon'...

sage: T.replace_polygon(0, q)
sage: T.polygon(0)
Polygon(vertices=[(0, 0), (2, 0), (2, 2), (0, 2)])
glue(x, y)[source]

Glue the (label, edge) pair x with the pair y in this surface.

This unglues any existing gluings of these edges.

Note

After a sequence of such glue operations, no edges must be unglued. Otherwise, gluings get copied over from the underlying surface with confusing side effects.

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase()

sage: from flatsurf.geometry.lazy import LazyMutableOrientedSimilaritySurface
sage: T = LazyMutableOrientedSimilaritySurface(S)
sage: T.gluings()
(((0, 0), (1, 2)), ((0, 1), (-1, 3)), ((0, 2), (1, 0)), ((0, 3), (-1, 1)), ((1, 0), (0, 2)), ((1, 1), (2, 3)), ((1, 2), (0, 0)), ((1, 3), (2, 1)), ((-1, 0), (-2, 2)),
 ((-1, 1), (0, 3)), ((-1, 2), (-2, 0)), ((-1, 3), (0, 1)), ((2, 0), (3, 2)), ((2, 1), (1, 3)), ((2, 2), (3, 0)), ((2, 3), (1, 1)), …)
sage: T.glue((0, 0), (1, 0))
sage: T.glue((1, 2), (0, 2))
sage: T.gluings()
(((0, 0), (1, 0)), ((0, 1), (-1, 3)), ((0, 2), (1, 2)), ((0, 3), (-1, 1)), ((1, 0), (0, 0)), ((1, 1), (2, 3)), ((1, 2), (0, 2)), ((1, 3), (2, 1)), ((-1, 0), (-2, 2)),
 ((-1, 1), (0, 3)), ((-1, 2), (-2, 0)), ((-1, 3), (0, 1)), ((2, 0), (3, 2)), ((2, 1), (1, 3)), ((2, 2), (3, 0)), ((2, 3), (1, 1)), …)
is_mutable()[source]

Return whether this surface is mutable, i.e., return True.

This implements flatsurf.geometry.categories.topological_surfaces.TopologicalSurfaces.ParentMethods.is_mutable().

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase()

sage: from flatsurf.geometry.lazy import LazyMutableOrientedSimilaritySurface
sage: T = LazyMutableOrientedSimilaritySurface(S)
sage: T.is_mutable()
True
opposite_edge(label, edge)[source]

Return the polygon label and edge index when crossing over the edge of the polygon label.

This implements flatsurf.geometry.categories.polygonal_surfaces.PolygonalSurfaces.ParentMethods.opposite_edge().

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase()

sage: from flatsurf.geometry.lazy import LazyMutableOrientedSimilaritySurface
sage: T = LazyMutableOrientedSimilaritySurface(S)
sage: T.opposite_edge(0, 0)
(1, 2)
polygon(label)[source]

Return the polygon with label.

This implements flatsurf.geometry.categories.polygonal_surfaces.PolygonalSurfaces.ParentMethods.polygon().

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase()

sage: from flatsurf.geometry.lazy import LazyMutableOrientedSimilaritySurface
sage: T = LazyMutableOrientedSimilaritySurface(S)
sage: T.polygon(0)
Polygon(vertices=[(0, 0), (1, 0), (1, 1), (0, 1)])
replace_polygon(label, polygon)[source]

Swap out the polygon with the label label with polygon.

The polygons must have the same number of sides since gluings are kept.

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase()

sage: from flatsurf.geometry.lazy import LazyMutableOrientedSimilaritySurface
sage: T = LazyMutableOrientedSimilaritySurface(S)
sage: T.replace_polygon(0, T.polygon(0))
class flatsurf.geometry.lazy.LazyOrientedSimilaritySurface(base_ring, reference, category=None)[source]

A surface that forwards all queries to an underlying reference surface.

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase()
sage: T = matrix([[2, 0], [0, 1]]) * S

sage: from flatsurf.geometry.lazy import LazyOrientedSimilaritySurface
sage: isinstance(T, LazyOrientedSimilaritySurface)
True
is_compact()[source]

Return whether this surface is compact as a topological space.

This implements flatsurf.geometry.categories.topological_surfaces.TopologicalSurfaces.ParentMethods.is_compact().

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.octagon_and_squares()
sage: r = matrix(ZZ,[[0, 1], [1, 0]])
sage: S = r * S

sage: S.is_compact()
True
is_mutable()[source]

Return whether this surface could be changing.

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase()
sage: T = matrix([[2, 0], [0, 1]]) * S
sage: T.is_mutable()
False
is_translation_surface(positive=True)[source]

Return whether this surface is a translation surface, i.e., glued edges can be transformed into each other by translations.

This implements flatsurf.geometry.categories.similarity_surfaces.SimilaritySurfaces.ParentMethods.is_translation_surface().

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.octagon_and_squares()
sage: r = matrix(ZZ,[[0, 1], [1, 0]])
sage: S = r * S

sage: S.is_translation_surface()
True
labels()[source]

Return the labels of this surface which are just the labels of the underlying reference surface.

This implements flatsurf.geometry.categories.polygonal_surfaces.PolygonalSurfaces.ParentMethods.labels().

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase()

sage: from flatsurf.geometry.lazy import LazyMutableOrientedSimilaritySurface
sage: T = LazyMutableOrientedSimilaritySurface(S)
sage: T.labels()
(0, 1, -1, 2, -2, 3, -3, 4, -4, 5, -5, 6, -6, 7, -7, 8, …)
opposite_edge(label, edge)[source]

Return the polygon label and edge index when crossing over the edge of the polygon label.

This implements flatsurf.geometry.categories.polygonal_surfaces.PolygonalSurfaces.ParentMethods.opposite_edge().

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase()
sage: T = matrix([[2, 0], [0, 1]]) * S
sage: T.opposite_edge(0, 0)
(1, 2)
polygon(label)[source]

Return the polygon with label.

This implements flatsurf.geometry.categories.polygonal_surfaces.PolygonalSurfaces.ParentMethods.polygon().

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase()
sage: T = matrix([[2, 0], [0, 1]]) * S
sage: T.polygon(0)
Polygon(vertices=[(0, 0), (2, 0), (2, 1), (0, 1)])
roots()[source]

Return root labels for the polygons forming the connected components of this surface.

This implements flatsurf.geometry.categories.polygonal_surfaces.PolygonalSurfaces.ParentMethods.roots().

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase()

sage: from flatsurf.geometry.lazy import LazyMutableOrientedSimilaritySurface
sage: T = LazyMutableOrientedSimilaritySurface(S)
sage: T.roots()
(0,)
class flatsurf.geometry.lazy.LazyRelabeledSurface(reference, category=None)[source]

A relabeled surface which forwards all requests to an underlying reference surface after translation of labels.

Subclasses may override _to_reference_label and _from_reference_label to establish a custom mapping of labels. Otherwise, labels are mapped to the non-negative integers in order.

EXAMPLES:

sage: from flatsurf.geometry.chamanara import chamanara_surface
sage: S = chamanara_surface(1/2)
labels()[source]

Return the labels of this surface after renaming.

sage: from flatsurf.geometry.chamanara import chamanara_surface sage: S = chamanara_surface(1/2) sage: S.labels() (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, …)

opposite_edge(label, edge)[source]

Return the polygon label and its edge that is across from the polygon with label and its edge.

Return None if there is no polygon glued to that edge.

EXAMPLES:

sage: from flatsurf.geometry.chamanara import chamanara_surface
sage: S = chamanara_surface(1/2)
sage: S.opposite_edge(0, 0)
(1, 0)
sage: S.opposite_edge(1, 0)
(0, 0)
polygon(label)[source]

Return the polygon with label in this surface.

EXAMPLES:

sage: from flatsurf.geometry.chamanara import chamanara_surface
sage: S = chamanara_surface(1/2)
sage: S.polygon(0)
Polygon(vertices=[(0, 0), (1, 0), (-1, 2), (-1, 1)])
roots()[source]

Return the labels of the roots of the components of this surface.

EXAMPLES:

sage: from flatsurf.geometry.chamanara import chamanara_surface
sage: S = chamanara_surface(1/2)
sage: S.roots()
(0,)
class flatsurf.geometry.lazy.LazyTriangulatedSurface(surface, labels=None, relabel=None, category=None)[source]

A triangulated surface whose structure is computed on demand.

Used to triangulate surfaces when in-place-triangulation is not requested. In particular, this is used to triangulate infinite type surface.

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase()
sage: S = S.triangulate().codomain()
is_compact()[source]

Return whether this surface is compact as a topological space.

This implements flatsurf.geometry.categories.topological_surfaces.TopologicalSurfaces.ParentMethods.is_compact().

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase().triangulate().codomain()
sage: S.is_compact()
False
is_mutable()[source]

Return whether this surface is mutable, i.e., return False.

This implements flatsurf.geometry.categories.topological_surfaces.TopologicalSurfaces.ParentMethods.is_mutable().

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase().triangulate().codomain()
sage: S.is_mutable()
False
is_triangulated(limit=None)[source]

Return whether this surface is triangulated.

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase().triangulate().codomain()
sage: S.is_triangulated()
True

sage: S = translation_surfaces.infinite_staircase().triangulate(label=0).codomain()
sage: S.is_triangulated()
Traceback (most recent call last):
...
NotImplementedError: cannot decide whether this (potentially infinite type) surface is triangulated
labels()[source]

Return the labels of this surface.

This implements flatsurf.geometry.categories.polygonal_surfaces.PolygonalSurfaces.ParentMethods.labels().

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase().triangulate().codomain()
sage: S.labels()
((0, 0), (1, 1), (-1, 1), (0, 1), (1, 0), (2, 0), (-1, 0), (-2, 0), (2, 1), (3, 1), (-2, 1), (-3, 1), (3, 0), (4, 0), (-3, 0), (-4, 0), …)
opposite_edge(label, edge)[source]

Return the polygon label and edge index when crossing over the edge of the polygon label.

This implements flatsurf.geometry.categories.polygonal_surfaces.PolygonalSurfaces.ParentMethods.opposite_edge().

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase().triangulate().codomain()
sage: S.opposite_edge((0, 0), 0)
((1, 1), 1)
polygon(label)[source]

Return the polygon with label.

This implements flatsurf.geometry.categories.polygonal_surfaces.PolygonalSurfaces.ParentMethods.polygon().

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase().triangulate().codomain()
sage: S.polygon((0, 0))
Polygon(vertices=[(0, 0), (1, 0), (1, 1)])
roots()[source]

Return root labels for the polygons forming the connected components of this surface.

This implements flatsurf.geometry.categories.polygonal_surfaces.PolygonalSurfaces.ParentMethods.roots().

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase().triangulate().codomain()
sage: S.roots()
((0, 0),)
class flatsurf.geometry.lazy.TriangulationLabels(surface, finite=None)[source]

The labels of a triangulation of a (possibly infinite) surface.

EXAMPLES:

sage: from flatsurf import translation_surfaces
sage: S = translation_surfaces.infinite_staircase().triangulate().codomain()
sage: labels = S.labels()