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