Transformations

As a geometry library, hypertiling relies heavily on transformation functions, such as translations, rotations, reflections, etc, both applied to single vertices, arrays of vertices or cell objects. Since those functions are at the core of the package, some of them are heavily optimized, using e.g. numba just-in-time compilation and furthermore particularly designed to be numerically stable, given the coordinate singularities that come with the Poincare disk representation of hyperbolic geometry. Some of the transformations are internally available in double-double precision.

Double-double precision is a technique used in computing to achieve higher precision than what is provided by a standard double-precision floating-point format. While a standard double-precision floating-point number uses 64 bits to represent a number, double-double precision effectively uses two 64-bit double-precision numbers to represent a single number with greater precision. This technique allows for a significant increase in the number of significant digits that can be accurately represented.

Moebius Transformations

These are the standard Moebius transformations available in the package:

hypertiling.transformation.moeb_origin_trafo(z0, z)

Maps all points z such that z0 -> 0, respecting the Poincare projection: (z - z0)/(1 - z0 * z)

Parameters:
  • z0 (complex) – The origin that we map back to.

  • z (complex) – The point that we will tr

Returns:

ret – z Möbius transformed around z0: (z - z0)/(1 - z0 * z)

Return type:

complex

hypertiling.transformation.moeb_origin_trafo_inversedd(z0, dz0, z, dz)

Inverse Möbius transform to the origin in double double representation.

Parameters:
  • z0 (complex)

  • dz0 (complex)

  • z (complex)

  • dz (complex)

Returns:

The inverse transformed complex numbers (ret, dret)

Return type:

tuple of complex

hypertiling.transformation.moeb_origin_trafodd(z0, dz0, z, dz)

Möbius transform to the origin in double double representation.

Parameters:
  • z0 (complex)

  • dz0 (complex)

  • z (complex)

  • dz (complex)

Returns:

The transformed complex numbers (ret, dret)

Return type:

tuple of complex

hypertiling.transformation.moeb_rotate_trafo(phi, z)

Rotates z by phi counter-clockwise about the origin.

hypertiling.transformation.moeb_rotate_trafodd(z, dz, phi)

Rotation of a complex number.

Parameters:
  • z (complex)

  • dz (complex)

  • phi (float)

Returns:

The rotated complex numbers (ret, dret)

Return type:

tuple of complex


Array Transformations

In the arraytransformation module we find the corresponding function, acting on arrays of points:

hypertiling.arraytransformation.mfull(p, phi, ind, vertices)

Apply all transformations(origin, rotate, inv_origin) in dd precision to the vertices of an entire polygon.

Arguments:

pint

Number of outer vertices.

phifloat

Angle of roatation

indint

Index of vertex that defines the Moebius Transform

verticesnp.array[complex128]

Array containing center of the polygon and the list of vertices.

hypertiling.arraytransformation.mfull_point(z0, phi, p)

Apply all transformations(origin, rotate, inv_origin) to a single vertex.

Arguments:

z0complex128

Vertex that we transform around.

phifloat

Angle of rotation.

pcomplex128

The vertex that we want to fully transform.

hypertiling.arraytransformation.moeb_origin_vector(p, z0, points)

Apply Moebius translation to an array of length p

Arguments:

pint

Length of point list

z0complex128

Vertex that we transform around.

pointscomplex128[]

List of points in the Poincare disk

hypertiling.arraytransformation.morigin(p, z0, vertices)

Apply Moebius transform to an array of length (p+1) of vertices.

Arguments:

pint

Number of outer vertices.

z0complex128

Vertex that we transform around.

verticesnp.array[complex128]

Array containing center of the polygon and the list of vertices.

hypertiling.arraytransformation.mrotate(p, phi, vertices)

Rotate an array of length (p + 1) of complex vertices.

Arguments:

pint

Number of outer vertices.

phifloat

Angle of rotation

verticesnp.array[complex128]

Array containing center of the polygon and the list of vertices.

hypertiling.arraytransformation.multi_rotation_around_vertex(qn, dqhi, z0, p)

Perform qn discrete rotations by i*dqhi of p around z0