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 polygonlabel
.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 polygonlabel
.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 polygonlabel
.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 pairy
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 polygonlabel
.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
withpolygon
.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 polygonlabel
.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 itsedge
.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)
- 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 polygonlabel
.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()