Geodesics

In this notebook we demonstrate how geodesic lines in the Poincare disk can be constructed

See also the notebook “advanced-visualization”, where the vector graphics capabilities of hypertiling are demonstrated.

[1]:
import numpy as np
import matplotlib.cm as cmap
import matplotlib.pyplot as plt
[2]:
from hypertiling import HyperbolicTiling
from hypertiling.graphics.plot import plot_tiling
from hypertiling.geodesics import geodesic_arc, geodesic_midpoint

Construct arc circles and midpoints

[3]:
# sample points
z1 = complex(-0.1,0.7)
z2 = complex(0.7,0.3)

z3 = complex(-0.2,-0.8)
z4 = complex(-0.4,0.5)

z5 = complex(-0.0,-0.8)
z6 = complex(-0.0,0.0)
[4]:
fig, ax = plt.subplots(figsize=(5,5), dpi=100)

# construct midpoint between z1 and z2
plt.scatter(z1.real, z1.imag, c="k")
plt.scatter(z2.real, z2.imag, c="k")
zm = geodesic_midpoint(z1,z2)
plt.scatter(zm.real, zm.imag, zorder=4)
# plot circle arc
arc = geodesic_arc(z1,z2,lw=1)
arc.set_color('k')
ax.add_artist(arc)

# construct midpoint between z3 and z4
plt.scatter(z3.real, z3.imag, c="k")
plt.scatter(z4.real, z4.imag, c="k")
zm = geodesic_midpoint(z3,z4)
plt.scatter(zm.real, zm.imag, zorder=4)
# plot circle arc
arc = geodesic_arc(z3,z4,lw=1)
arc.set_color('k')
ax.add_artist(arc)

# construct midpoint between z5 and z6
plt.scatter(z5.real, z5.imag, c="k")
plt.scatter(z6.real, z6.imag, c="k")
zm = geodesic_midpoint(z5,z6)
plt.scatter(zm.real, zm.imag, zorder=4)
# plot circle arc
arc = geodesic_arc(z5,z6,lw=1)
arc.set_color('k')
ax.add_artist(arc)

# plot unit circle
ax.add_patch(plt.Circle((0.0, 0.0), radius=1, edgecolor='k', facecolor='None'))
plt.xlim(-1.1,1.1); plt.ylim(-1.1,1.1)
plt.gca().set_aspect('equal')
plt.minorticks_on()
plt.tight_layout(); plt.show()
../_images/examples_geodesics_7_0.png

Use geodesic line segments in tiling plots

[5]:
from hypertiling.graphics.plot import convert_polygons_to_patches, convert_edges_to_arcs
[6]:
# construct tiling
T = HyperbolicTiling(3,7,6)

# create figure
fig, ax = plt.subplots(figsize=(8,7), dpi=100)

# plot cells with simple (non-geodesic) edges
pgons = convert_polygons_to_patches(T, np.zeros(len(T)), cmap=cmap.RdBu, edgecolor="0.85", clim=[-1,1])
ax.add_collection(pgons)

# convert cell edges to matplotlib arcs
edges, types = convert_edges_to_arcs(T, lw=0.4)
for edge in edges:
    ax.add_artist(edge)
    edge.set_color('k')

plt.xlim(-1,1); plt.ylim(-1,1)
plt.axis("off"); plt.gca().set_aspect('equal')
plt.tight_layout(); plt.show()
../_images/examples_geodesics_10_0.png
[7]:
# construct tiling
T = HyperbolicTiling(4,8,4)

# create figure
fig, ax = plt.subplots(figsize=(8,7), dpi=100)

# plot cells with simple (non-geodesic) edges
pgons = convert_polygons_to_patches(T, np.zeros(len(T)), cmap=cmap.RdBu, edgecolor="0.85", clim=[-1,1])
ax.add_collection(pgons)

# convert cell edges to matplotlib arcs
edges, types = convert_edges_to_arcs(T, lw=0.4)
for edge in edges:
    ax.add_artist(edge)
    edge.set_color('k')

plt.xlim(-1,1); plt.ylim(-1,1)
plt.axis("off"); plt.gca().set_aspect('equal')
plt.tight_layout(); plt.show()
../_images/examples_geodesics_11_0.png