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}.\]

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)[source]

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)[source]

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)[source]

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: hyperbolic_arc(0, 1)
Graphics object consisting of 1 graphics primitive
>>> from sage.all import *
>>> hyperbolic_arc(Integer(0), Integer(1))
Graphics object consisting of 1 graphics primitive
hyperbolic_arc(0, 1)
../../_images/hyperbolic_arc-1.svg

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

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

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

sage: hyperbolic_arc(1+I, 1+2*I, linestyle='dashed', color='green')
Graphics object consisting of 1 graphics primitive
>>> 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
hyperbolic_arc(1+I, 1+2*I, linestyle='dashed', color='green')
../../_images/hyperbolic_arc-3.svg
sage: hyperbolic_arc(-1+I, 1+2*I, linestyle='--', color='orange')
Graphics object consisting of 1 graphics primitive
>>> from sage.all import *
>>> hyperbolic_arc(-Integer(1)+I, Integer(1)+Integer(2)*I, linestyle='--', color='orange')
Graphics object consisting of 1 graphics primitive
hyperbolic_arc(-1+I, 1+2*I, linestyle='--', color='orange')
../../_images/hyperbolic_arc-4.svg

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

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

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: 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
>>> 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
z1 = CC(0,1)
z2 = CC(-1,0)
z3 = CC((cos(pi/3),sin(pi/3)))
z4 = CC((0.6*cos(3*pi/4),0.6*sin(3*pi/4)))
z5 = CC(-0.5,0.5)
z6 = CC(0.5,-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
../../_images/hyperbolic_arc-6.svg

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: 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
>>> 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
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
../../_images/hyperbolic_arc-7.svg

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

sage: a = (1,2,sqrt(6))
sage: b = (-2,-3,sqrt(14))
sage: hyperbolic_arc(a, b, model='HM')
Graphics3d Object
>>> 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
a = (1,2,sqrt(6))
b = (-2,-3,sqrt(14))
hyperbolic_arc(a, b, model='HM')
../../_images/hyperbolic_arc-8.svg