Arcs in hyperbolic geometry - 2D Graphics

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

# Arcs in hyperbolic geometry

AUTHORS:

- Hartmut Monien (2011 - 08)

Three models of the hyperbolic plane are implemented: Upper Half Plane, Poincaré Disk, and Klein Disk, each with its different domain and metric tensor.

Upper half plane (UHP)

In this model, hyperbolic points are described by two coordinates, which we will represent by a complex number in the domain

\[H = \{ z \in \CC \mid \Im(z)>0 \}\]

with the corresponding metric tensor

\[ds^2 = \frac{dzd\bar{z}}{\Im(z)^2}.\]

Poincaré disk (PD)

In this model, hyperbolic points are described by two coordinates, which we will represent by a complex number within the unit circle, having therefore the following domain

\[D = \{ z \in \CC \mid \lvert z \rvert < 1\}\]

with the corresponding metric tensor

\[ds^2 = 4 \frac{dzd\bar{z}}{(1-\lvert z \rvert^2)^2}.\]

Klein disk (KM)

In this model, the domain is again complex numbers within the unit circle as in the Poincaré disk model, but the corresponding metric tensor is different:

\[ds^2 = \frac{dzd\bar{z}}{1-\lvert z \rvert^2} + \frac{(z \cdot dz)^2}{(1-\lvert z \rvert^2)^2}.\]

See also

`sage.geometry.hyperbolic_space.hyperbolic_geodesic`

REFERENCES:

For additional models of the hyperbolic plane and its relationship see [CFKP1997]. For a more detailed explanation on hyperbolic arcs see [Sta1993].

class sage.plot.hyperbolic_arc.HyperbolicArc(A, B, model, options)

  Bases: `HyperbolicArcCore`

  Primitive class for hyberbolic arc type.

  See `hyperbolic_arc?` for information about plotting a hyperbolic arc in the complex plane.

  INPUT:

  - `A`, `B` – end points of the hyperbolic arc

  - `model` – the hyperbolic model used, which is one of the following:

    - `'UHP'` – upper half plane

    - `'PD'` – Poincaré disk

    - `'KM'` – Klein disk

class sage.plot.hyperbolic_arc.HyperbolicArcCore(path, options)

  Bases: `BezierPath`

  Base class for Hyperbolic arcs and hyperbolic polygons in the hyperbolic plane.

  The Upper Half Model, Poincaré Disk Model, and Klein Disk model are supported.

sage.plot.hyperbolic_arc.hyperbolic_arc(a, b, model='UHP', alpha=1, fill=False, thickness=1, rgbcolor='blue', zorder=2, linestyle='solid', **options)

  Plot an arc from `a` to `b` in hyperbolic plane.

  INPUT:

  - `a`, `b` – complex numbers connected by a hyperbolic arc

  - `model` – (default: `'UHP'`) hyperbolic model used, which is one of the following:

    - `'UHP'` – upper half plane

    - `'PD'` – Poincaré disk

    - `'KM'` – Klein disk

    - `'HM'` – hyperboloid model

  OPTIONS:

  - `alpha` – (default: 1)

  - `thickness` – (default: 1)

  - `rgbcolor` – (default: `'blue'`)

  - `linestyle` – (default: `'solid'`) the style of the line, which is one of `'dashed'`, `'dotted'`, `'solid'`, `'dashdot'`, or `'--'`, `':'`, `'-'`, `'-.'`, respectively

  EXAMPLES:

  Show a hyperbolic arc from \(0\) to \(1\):

  Sage

      sage: hyperbolic_arc(0, 1)
      Graphics object consisting of 1 graphics primitive

  Python

      >>> from sage.all import *
      >>> hyperbolic_arc(Integer(0), Integer(1))
      Graphics object consisting of 1 graphics primitive

  Show a hyperbolic arc from \(1/2\) to \(i\) with a red thick line:

  Sage

      sage: hyperbolic_arc(0.5, I,color='red', thickness=2)
      Graphics object consisting of 1 graphics primitive

  [Python]

      >>> from sage.all import *
      >>> hyperbolic_arc(RealNumber('0.5'), I,color='red', thickness=Integer(2))
      Graphics object consisting of 1 graphics primitive

  Show a hyperbolic arc from \(1+i\) to \(1+2i\) with dashed line:

  Sage

      sage: hyperbolic_arc(1+I, 1+2*I, linestyle='dashed', color='green')
      Graphics object consisting of 1 graphics primitive

  Python

      >>> from sage.all import *
      >>> hyperbolic_arc(Integer(1)+I, Integer(1)+Integer(2)*I, linestyle='dashed', color='green')
      Graphics object consisting of 1 graphics primitive

  Sage

      sage: hyperbolic_arc(-1+I, 1+2*I, linestyle='--', color='orange')
      Graphics object consisting of 1 graphics primitive

  [Python]

      >>> from sage.all import *
      >>> hyperbolic_arc(-Integer(1)+I, Integer(1)+Integer(2)*I, linestyle='--', color='orange')
      Graphics object consisting of 1 graphics primitive

  Show a hyperbolic arc from a \(1+i\) to infinity:

  Sage

      sage: hyperbolic_arc(1 + I, infinity, color='brown')
      Graphics object consisting of 1 graphics primitive

  Python

      >>> from sage.all import *
      >>> hyperbolic_arc(Integer(1) + I, infinity, color='brown')
      Graphics object consisting of 1 graphics primitive

  We can also plot hyperbolic arcs in other models.

  We show a hyperbolic arc from \(i\) to \(-1\) in red, another hyperbolic arc from \(e^{i\pi/3}\) to \(0.6 \cdot e^{i 3\pi/4}\) with dashed style in green, and finally a hyperbolic arc from \(-0.5+0.5i\) to \(0.5-0.5i\) together with the disk frontier in the Poincaré disk model:

  Sage

      sage: z1 = CC(0,1)
      sage: z2 = CC(-1,0)
      sage: z3 = CC((cos(pi/3),sin(pi/3)))
      sage: z4 = CC((0.6*cos(3*pi/4),0.6*sin(3*pi/4)))
      sage: z5 = CC(-0.5,0.5)
      sage: z6 = CC(0.5,-0.5)
      sage: a1 = hyperbolic_arc(z1, z2, model='PD', color='red')
      sage: a2 = hyperbolic_arc(z3, z4, model='PD', color='green')
      sage: a3 = hyperbolic_arc(z5, z6, model='PD', linestyle='--')
      sage: a1 + a2 + a3
      Graphics object consisting of 6 graphics primitives

  [Python]

      >>> from sage.all import *
      >>> z1 = CC(Integer(0),Integer(1))
      >>> z2 = CC(-Integer(1),Integer(0))
      >>> z3 = CC((cos(pi/Integer(3)),sin(pi/Integer(3))))
      >>> z4 = CC((RealNumber('0.6')*cos(Integer(3)*pi/Integer(4)),RealNumber('0.6')*sin(Integer(3)*pi/Integer(4))))
      >>> z5 = CC(-RealNumber('0.5'),RealNumber('0.5'))
      >>> z6 = CC(RealNumber('0.5'),-RealNumber('0.5'))
      >>> a1 = hyperbolic_arc(z1, z2, model='PD', color='red')
      >>> a2 = hyperbolic_arc(z3, z4, model='PD', color='green')
      >>> a3 = hyperbolic_arc(z5, z6, model='PD', linestyle='--')
      >>> a1 + a2 + a3
      Graphics object consisting of 6 graphics primitives

  We show the arcs defined by the same endpoints in the Klein disk model (note that these are not the image of those arcs when changing between the models):

  Sage

      sage: a1 = hyperbolic_arc(z1, z2, model='KM', color='red')
      sage: a2 = hyperbolic_arc(z3, z4, model='KM', color='green')
      sage: a3 = hyperbolic_arc(z5, z6, model='KM', linestyle='--')
      sage: a1 + a2 + a3
      Graphics object consisting of 6 graphics primitives

  Python

      >>> from sage.all import *
      >>> a1 = hyperbolic_arc(z1, z2, model='KM', color='red')
      >>> a2 = hyperbolic_arc(z3, z4, model='KM', color='green')
      >>> a3 = hyperbolic_arc(z5, z6, model='KM', linestyle='--')
      >>> a1 + a2 + a3
      Graphics object consisting of 6 graphics primitives

  Show a hyperbolic arc from \((1,2,\sqrt(6))\) to \((-2,-3,\sqrt(14))\) in the hyperboloid model:

  Sage

      sage: a = (1,2,sqrt(6))
      sage: b = (-2,-3,sqrt(14))
      sage: hyperbolic_arc(a, b, model='HM')
      Graphics3d Object

  [Python]

      >>> from sage.all import *
      >>> a = (Integer(1),Integer(2),sqrt(Integer(6)))
      >>> b = (-Integer(2),-Integer(3),sqrt(Integer(14)))
      >>> hyperbolic_arc(a, b, model='HM')
      Graphics3d Object