Hyperbolic Points - Hyperbolic Geometry

Skip to content
Back to top
View this page
Edit this page

# Hyperbolic Points

This module implements points in hyperbolic space of arbitrary dimension. It also contains the implementations for specific models of hyperbolic geometry.

This module also implements ideal points in hyperbolic space of arbitrary dimension. It also contains the implementations for specific models of hyperbolic geometry.

Note that not all models of hyperbolic space are bounded, meaning that the ideal boundary is not the topological boundary of the set underlying tho model. For example, the unit disk model is bounded with boundary given by the unit sphere. The hyperboloid model is not bounded.

AUTHORS:

- Greg Laun (2013): initial version

EXAMPLES:

We can construct points in the upper half plane model, abbreviated UHP for convenience:

Sage

    sage: UHP = HyperbolicPlane().UHP()
    sage: UHP.get_point(2 + I)
    Point in UHP I + 2
    sage: g = UHP.get_point(3 + I)
    sage: g.dist(UHP.get_point(I))
    arccosh(11/2)

Python

    >>> from sage.all import *
    >>> UHP = HyperbolicPlane().UHP()
    >>> UHP.get_point(Integer(2) + I)
    Point in UHP I + 2
    >>> g = UHP.get_point(Integer(3) + I)
    >>> g.dist(UHP.get_point(I))
    arccosh(11/2)

We can also construct boundary points in the upper half plane model:

Sage

    sage: UHP.get_point(3)
    Boundary point in UHP 3

[Python]

    >>> from sage.all import *
    >>> UHP.get_point(Integer(3))
    Boundary point in UHP 3

Some more examples:

Sage

    sage: HyperbolicPlane().UHP().get_point(0)
    Boundary point in UHP 0

    sage: HyperbolicPlane().PD().get_point(I/2)
    Point in PD 1/2*I

    sage: HyperbolicPlane().KM().get_point((0,1))
    Boundary point in KM (0, 1)

    sage: HyperbolicPlane().HM().get_point((0,0,1))
    Point in HM (0, 0, 1)

Python

    >>> from sage.all import *
    >>> HyperbolicPlane().UHP().get_point(Integer(0))
    Boundary point in UHP 0

    >>> HyperbolicPlane().PD().get_point(I/Integer(2))
    Point in PD 1/2*I

    >>> HyperbolicPlane().KM().get_point((Integer(0),Integer(1)))
    Boundary point in KM (0, 1)

    >>> HyperbolicPlane().HM().get_point((Integer(0),Integer(0),Integer(1)))
    Point in HM (0, 0, 1)

class sage.geometry.hyperbolic_space.hyperbolic_point.HyperbolicPoint(model, coordinates, is_boundary, check=True, **graphics_options)

  Bases: `Element`

  Abstract base class for hyperbolic points. This class should never be instantiated.

  INPUT:

  - `model` – the model of the hyperbolic space

  - `coordinates` – the coordinates of a hyperbolic point in the appropriate model

  - `is_boundary` – whether the point is a boundary point

  - `check` – boolean (default: `True`); if `True`, then check to make sure the coordinates give a valid point in the model

  EXAMPLES:

  Comparison between different models is performed via coercion:

  Sage

      sage: UHP = HyperbolicPlane().UHP()
      sage: p = UHP.get_point(.2 + .3*I); p
      Point in UHP 0.200000000000000 + 0.300000000000000*I

      sage: PD = HyperbolicPlane().PD()
      sage: q = PD.get_point(0.2 + 0.3*I); q
      Point in PD 0.200000000000000 + 0.300000000000000*I

      sage: p == q
      False
      sage: PD(p)
      Point in PD 0.231213872832370 - 0.502890173410405*I

      sage: bool(p.coordinates() == q.coordinates())
      True

  Python

      >>> from sage.all import *
      >>> UHP = HyperbolicPlane().UHP()
      >>> p = UHP.get_point(RealNumber('.2') + RealNumber('.3')*I); p
      Point in UHP 0.200000000000000 + 0.300000000000000*I

      >>> PD = HyperbolicPlane().PD()
      >>> q = PD.get_point(RealNumber('0.2') + RealNumber('0.3')*I); q
      Point in PD 0.200000000000000 + 0.300000000000000*I

      >>> p == q
      False
      >>> PD(p)
      Point in PD 0.231213872832370 - 0.502890173410405*I

      >>> bool(p.coordinates() == q.coordinates())
      True

  Similarly for boundary points:

  Sage

      sage: p = UHP.get_point(-1); p
      Boundary point in UHP -1

      sage: q = PD.get_point(-1); q
      Boundary point in PD -1

      sage: p == q
      True
      sage: PD(p)
      Boundary point in PD -1

  [Python]

      >>> from sage.all import *
      >>> p = UHP.get_point(-Integer(1)); p
      Boundary point in UHP -1

      >>> q = PD.get_point(-Integer(1)); q
      Boundary point in PD -1

      >>> p == q
      True
      >>> PD(p)
      Boundary point in PD -1

  It is an error to specify a point that does not lie in the appropriate model:

  Sage

      sage: HyperbolicPlane().UHP().get_point(0.2 - 0.3*I)
      Traceback (most recent call last):
      ...
      ValueError: 0.200000000000000 - 0.300000000000000*I is not a valid point in the UHP model

      sage: HyperbolicPlane().PD().get_point(1.2)
      Traceback (most recent call last):
      ...
      ValueError: 1.20000000000000 is not a valid point in the PD model

      sage: HyperbolicPlane().KM().get_point((1,1))
      Traceback (most recent call last):
      ...
      ValueError: (1, 1) is not a valid point in the KM model

      sage: HyperbolicPlane().HM().get_point((1, 1, 1))
      Traceback (most recent call last):
      ...
      ValueError: (1, 1, 1) is not a valid point in the HM model

  Python

      >>> from sage.all import *
      >>> HyperbolicPlane().UHP().get_point(RealNumber('0.2') - RealNumber('0.3')*I)
      Traceback (most recent call last):
      ...
      ValueError: 0.200000000000000 - 0.300000000000000*I is not a valid point in the UHP model

      >>> HyperbolicPlane().PD().get_point(RealNumber('1.2'))
      Traceback (most recent call last):
      ...
      ValueError: 1.20000000000000 is not a valid point in the PD model

      >>> HyperbolicPlane().KM().get_point((Integer(1),Integer(1)))
      Traceback (most recent call last):
      ...
      ValueError: (1, 1) is not a valid point in the KM model

      >>> HyperbolicPlane().HM().get_point((Integer(1), Integer(1), Integer(1)))
      Traceback (most recent call last):
      ...
      ValueError: (1, 1, 1) is not a valid point in the HM model

  It is an error to specify an interior point of hyperbolic space as a boundary point:

  Sage

      sage: HyperbolicPlane().UHP().get_point(0.2 + 0.3*I, is_boundary=True)
      Traceback (most recent call last):
      ...
      ValueError: 0.200000000000000 + 0.300000000000000*I is not a valid boundary point in the UHP model

  [Python]

      >>> from sage.all import *
      >>> HyperbolicPlane().UHP().get_point(RealNumber('0.2') + RealNumber('0.3')*I, is_boundary=True)
      Traceback (most recent call last):
      ...
      ValueError: 0.200000000000000 + 0.300000000000000*I is not a valid boundary point in the UHP model

  coordinates()

    Return the coordinates of the point.

    EXAMPLES:

    Sage

        sage: HyperbolicPlane().UHP().get_point(2 + I).coordinates()
        I + 2

        sage: HyperbolicPlane().PD().get_point(1/2 + 1/2*I).coordinates()
        1/2*I + 1/2

        sage: HyperbolicPlane().KM().get_point((1/3, 1/4)).coordinates()
        (1/3, 1/4)

        sage: HyperbolicPlane().HM().get_point((0,0,1)).coordinates()
        (0, 0, 1)

    Python

        >>> from sage.all import *
        >>> HyperbolicPlane().UHP().get_point(Integer(2) + I).coordinates()
        I + 2

        >>> HyperbolicPlane().PD().get_point(Integer(1)/Integer(2) + Integer(1)/Integer(2)*I).coordinates()
        1/2*I + 1/2

        >>> HyperbolicPlane().KM().get_point((Integer(1)/Integer(3), Integer(1)/Integer(4))).coordinates()
        (1/3, 1/4)

        >>> HyperbolicPlane().HM().get_point((Integer(0),Integer(0),Integer(1))).coordinates()
        (0, 0, 1)

  graphics_options()

    Return the graphics options of the current point.

    EXAMPLES:

    Sage

        sage: p = HyperbolicPlane().UHP().get_point(2 + I, color='red')
        sage: p.graphics_options()
        {'color': 'red'}

    Python

        >>> from sage.all import *
        >>> p = HyperbolicPlane().UHP().get_point(Integer(2) + I, color='red')
        >>> p.graphics_options()
        {'color': 'red'}

  is_boundary()

    Return `True` if `self` is a boundary point.

    EXAMPLES:

    Sage

        sage: PD = HyperbolicPlane().PD()
        sage: p = PD.get_point(0.5+.2*I)
        sage: p.is_boundary()
        False
        sage: p = PD.get_point(I)
        sage: p.is_boundary()
        True

    Python

        >>> from sage.all import *
        >>> PD = HyperbolicPlane().PD()
        >>> p = PD.get_point(RealNumber('0.5')+RealNumber('.2')*I)
        >>> p.is_boundary()
        False
        >>> p = PD.get_point(I)
        >>> p.is_boundary()
        True

  model()

    Return the model to which the `HyperbolicPoint` belongs.

    EXAMPLES:

    Sage

        sage: HyperbolicPlane().UHP().get_point(I).model()
        Hyperbolic plane in the Upper Half Plane Model

        sage: HyperbolicPlane().PD().get_point(0).model()
        Hyperbolic plane in the Poincare Disk Model

        sage: HyperbolicPlane().KM().get_point((0,0)).model()
        Hyperbolic plane in the Klein Disk Model

        sage: HyperbolicPlane().HM().get_point((0,0,1)).model()
        Hyperbolic plane in the Hyperboloid Model

    Python

        >>> from sage.all import *
        >>> HyperbolicPlane().UHP().get_point(I).model()
        Hyperbolic plane in the Upper Half Plane Model

        >>> HyperbolicPlane().PD().get_point(Integer(0)).model()
        Hyperbolic plane in the Poincare Disk Model

        >>> HyperbolicPlane().KM().get_point((Integer(0),Integer(0))).model()
        Hyperbolic plane in the Klein Disk Model

        >>> HyperbolicPlane().HM().get_point((Integer(0),Integer(0),Integer(1))).model()
        Hyperbolic plane in the Hyperboloid Model

  show(boundary=True, **options)

    Plot `self`.

    EXAMPLES:

    Sage

        sage: HyperbolicPlane().PD().get_point(0).show()                            # needs sage.plot
        Graphics object consisting of 2 graphics primitives
        sage: HyperbolicPlane().KM().get_point((0,0)).show()                        # needs sage.plot
        Graphics object consisting of 2 graphics primitives
        sage: HyperbolicPlane().HM().get_point((0,0,1)).show()                      # needs sage.plot
        Graphics3d Object

    Python

        >>> from sage.all import *
        >>> HyperbolicPlane().PD().get_point(Integer(0)).show()                            # needs sage.plot
        Graphics object consisting of 2 graphics primitives
        >>> HyperbolicPlane().KM().get_point((Integer(0),Integer(0))).show()                        # needs sage.plot
        Graphics object consisting of 2 graphics primitives
        >>> HyperbolicPlane().HM().get_point((Integer(0),Integer(0),Integer(1))).show()                      # needs sage.plot
        Graphics3d Object

  symmetry_involution()

    Return the involutory isometry fixing the given point.

    EXAMPLES:

    Sage

        sage: z = HyperbolicPlane().UHP().get_point(3 + 2*I)
        sage: z.symmetry_involution()
        Isometry in UHP
        [  3/2 -13/2]
        [  1/2  -3/2]

        sage: HyperbolicPlane().UHP().get_point(I).symmetry_involution()
        Isometry in UHP
        [ 0 -1]
        [ 1  0]

        sage: HyperbolicPlane().PD().get_point(0).symmetry_involution()
        Isometry in PD
        [-I  0]
        [ 0  I]

        sage: HyperbolicPlane().KM().get_point((0, 0)).symmetry_involution()
        Isometry in KM
        [-1  0  0]
        [ 0 -1  0]
        [ 0  0  1]

        sage: HyperbolicPlane().HM().get_point((0,0,1)).symmetry_involution()
        Isometry in HM
        [-1  0  0]
        [ 0 -1  0]
        [ 0  0  1]

        sage: p = HyperbolicPlane().UHP().random_element()
        sage: A = p.symmetry_involution()
        sage: p.dist(A*p)  # abs tol 1e-10
        0

        sage: A.preserves_orientation()
        True

        sage: A*A == HyperbolicPlane().UHP().get_isometry(identity_matrix(2))       # needs scipy
        True

    Python

        >>> from sage.all import *
        >>> z = HyperbolicPlane().UHP().get_point(Integer(3) + Integer(2)*I)
        >>> z.symmetry_involution()
        Isometry in UHP
        [  3/2 -13/2]
        [  1/2  -3/2]

        >>> HyperbolicPlane().UHP().get_point(I).symmetry_involution()
        Isometry in UHP
        [ 0 -1]
        [ 1  0]

        >>> HyperbolicPlane().PD().get_point(Integer(0)).symmetry_involution()
        Isometry in PD
        [-I  0]
        [ 0  I]

        >>> HyperbolicPlane().KM().get_point((Integer(0), Integer(0))).symmetry_involution()
        Isometry in KM
        [-1  0  0]
        [ 0 -1  0]
        [ 0  0  1]

        >>> HyperbolicPlane().HM().get_point((Integer(0),Integer(0),Integer(1))).symmetry_involution()
        Isometry in HM
        [-1  0  0]
        [ 0 -1  0]
        [ 0  0  1]

        >>> p = HyperbolicPlane().UHP().random_element()
        >>> A = p.symmetry_involution()
        >>> p.dist(A*p)  # abs tol 1e-10
        0

        >>> A.preserves_orientation()
        True

        >>> A*A == HyperbolicPlane().UHP().get_isometry(identity_matrix(Integer(2)))       # needs scipy
        True

  to_model(model)

    Convert `self` to the `model`.

    INPUT:

    - `other` – (a string representing) the image model

    EXAMPLES:

    Sage

        sage: UHP = HyperbolicPlane().UHP()
        sage: PD = HyperbolicPlane().PD()
        sage: PD.get_point(1/2+I/2).to_model(UHP)
        Point in UHP I + 2
        sage: PD.get_point(1/2+I/2).to_model('UHP')
        Point in UHP I + 2

    Python

        >>> from sage.all import *
        >>> UHP = HyperbolicPlane().UHP()
        >>> PD = HyperbolicPlane().PD()
        >>> PD.get_point(Integer(1)/Integer(2)+I/Integer(2)).to_model(UHP)
        Point in UHP I + 2
        >>> PD.get_point(Integer(1)/Integer(2)+I/Integer(2)).to_model('UHP')
        Point in UHP I + 2

  update_graphics(update=False, **options)

    Update the graphics options of a `HyperbolicPoint`. If `update` is `True`, update rather than overwrite.

    EXAMPLES:

    Sage

        sage: p = HyperbolicPlane().UHP().get_point(I); p.graphics_options()
        {}

        sage: p.update_graphics(color = "red"); p.graphics_options()
        {'color': 'red'}

        sage: p.update_graphics(color = "blue"); p.graphics_options()
        {'color': 'blue'}

        sage: p.update_graphics(True, size = 20); p.graphics_options()
        {'color': 'blue', 'size': 20}

    Python

        >>> from sage.all import *
        >>> p = HyperbolicPlane().UHP().get_point(I); p.graphics_options()
        {}

        >>> p.update_graphics(color = "red"); p.graphics_options()
        {'color': 'red'}

        >>> p.update_graphics(color = "blue"); p.graphics_options()
        {'color': 'blue'}

        >>> p.update_graphics(True, size = Integer(20)); p.graphics_options()
        {'color': 'blue', 'size': 20}

class sage.geometry.hyperbolic_space.hyperbolic_point.HyperbolicPointUHP(model, coordinates, is_boundary, check=True, **graphics_options)

  Bases: `HyperbolicPoint`

  A point in the UHP model.

  INPUT:

  - the coordinates of a point in the unit disk in the complex plane \(\CC\)

  EXAMPLES:

  Sage

      sage: HyperbolicPlane().UHP().get_point(2*I)
      Point in UHP 2*I

      sage: HyperbolicPlane().UHP().get_point(1)
      Boundary point in UHP 1

  Python

      >>> from sage.all import *
      >>> HyperbolicPlane().UHP().get_point(Integer(2)*I)
      Point in UHP 2*I

      >>> HyperbolicPlane().UHP().get_point(Integer(1))
      Boundary point in UHP 1

  show(boundary=True, **options)

    Plot `self`.

    EXAMPLES:

    Sage

        sage: HyperbolicPlane().UHP().get_point(I).show()
        Graphics object consisting of 2 graphics primitives
        sage: HyperbolicPlane().UHP().get_point(0).show()                           # needs sage.plot
        Graphics object consisting of 2 graphics primitives
        sage: HyperbolicPlane().UHP().get_point(infinity).show()
        Traceback (most recent call last):
        ...
        NotImplementedError: can...t draw the point infinity

    Python

        >>> from sage.all import *
        >>> HyperbolicPlane().UHP().get_point(I).show()
        Graphics object consisting of 2 graphics primitives
        >>> HyperbolicPlane().UHP().get_point(Integer(0)).show()                           # needs sage.plot
        Graphics object consisting of 2 graphics primitives
        >>> HyperbolicPlane().UHP().get_point(infinity).show()
        Traceback (most recent call last):
        ...
        NotImplementedError: can...t draw the point infinity

  symmetry_involution()

    Return the involutory isometry fixing the given point.

    EXAMPLES:

    Sage

        sage: HyperbolicPlane().UHP().get_point(3 + 2*I).symmetry_involution()
        Isometry in UHP
        [  3/2 -13/2]
        [  1/2  -3/2]

    Python

        >>> from sage.all import *
        >>> HyperbolicPlane().UHP().get_point(Integer(3) + Integer(2)*I).symmetry_involution()
        Isometry in UHP
        [  3/2 -13/2]
        [  1/2  -3/2]