codex/past-exam-of-the-mathematics-course-of-the-university-of-cambridge/2002/iii/paper-47-elliptic-coordinates.py

past-exam-of-the-mathematics-course-of-the-university-of-cambridge/2002/iii/paper-47-elliptic-coordinates.py
"""Original elliptic-coordinate sketch; writes its PNG basename to caller CWD.

Python 3.14, NumPy 2.3.5 and Matplotlib 3.10.7. Caller supplies MPLCONFIGDIR.
"""
from pathlib import Path
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(9, 6), dpi=140, facecolor='white')
ax.set_facecolor('white')
xi = np.linspace(0, 2.0, 400)
colors = ['#617b91', '#2a8e77', '#5b69ac', '#b07f2c'] * 2
labels = [r'$\eta=0$',r'$\eta=\pi/4$',r'$\eta=\pi/2$',r'$\eta=3\pi/4$',r'$\eta=\pi$',r'$\eta=5\pi/4$',r'$\eta=3\pi/2$',r'$\eta=7\pi/4$']
for n in range(8):
    eta=n*np.pi/4
    x=np.cosh(xi)*np.cos(eta)
    y=np.sinh(xi)*np.sin(eta)
    ax.plot(x,y,color=colors[n],lw=1.6)
    t=1.32
    tx=np.cosh(t)*np.cos(eta);ty=np.sinh(t)*np.sin(eta)
    offsets={0:(.13,.12),1:(.06,.12),2:(.1,.06),3:(-.48,.12),4:(-.45,.12),5:(-.48,-.22),6:(.1,-.1),7:(.06,-.22)}
    dx,dy=offsets[n]
    ax.text(tx+dx,ty+dy,labels[n],color=colors[n],fontsize=10)
eta=np.linspace(0,2*np.pi,500)
ax.plot(np.cosh(1)*np.cos(eta),np.sinh(1)*np.sin(eta),color='#bd4b43',lw=2.1)
ax.text(1.56,.53,r'$\xi=1$',color='#bd4b43',fontsize=12)
ax.plot([-1,1],[0,0],color='#242424',lw=4,solid_capstyle='round',zorder=5)
ax.text(.2,.15,r'$\xi=0$: crack',fontsize=11,color='#242424')
ax.scatter([-1,1],[0,0],color='#242424',s=22,zorder=6)
ax.text(-1.13,-.23,r'$-a$',fontsize=11);ax.text(.94,-.23,r'$a$',fontsize=11)
ax.set(xlim=(-2.7,2.7),ylim=(-2.05,2.05),xlabel=r'$x/a$',ylabel=r'$y/a$')
ax.set_aspect('equal',adjustable='box')
ax.set_title('Elliptic coordinates around a line crack',pad=15,fontsize=15)
ax.grid(alpha=.15)
fig.tight_layout()
fig.savefig(Path.cwd()/'paper-47-elliptic-coordinates.png',facecolor='white',transparent=False)
plt.close(fig)