Setup¶

In [1]:
import math
from math import sqrt as mS
import matplotlib
from matplotlib.patches import Circle as mpC
import matplotlib.pyplot as plt
import numpy as np

Constants & Functions¶

In [2]:
#Viridis.
colors = ["#FDE725FF",
          "#7AD151FF",
          "#22A884FF",
          "#2A788EFF",
          "#414487FF",
          "#440154FF"]

#Clear axes.
def clearAx(ax):
    
    """
    Clear axes.

    Parameters:
    ax - Current ax.
    
    Returns:
    ax - Updated ax.
    """    
    
    ax.spines["top"].set_visible(False)
    ax.spines["right"].set_visible(False)
    ax.spines["bottom"].set_visible(False)
    ax.spines["left"].set_visible(False)
    ax.set_xticks([])
    ax.set_yticks([])
    return(ax)

Fiddler¶

In [3]:
def plotHelper() :

    fig = plt.figure(figsize = (8, 8))  
    ax = fig.add_subplot(xlim = (-5.1, 5.1),
                         ylim = (-5.1, 5.1))
    fig.subplots_adjust(left = 0.0,
                        bottom = 0,
                        right = 1,
                        top = 1)

     
    #Remove axes and ticks.
    ax = clearAx(ax)

    #Sphere.
    ax.add_patch(mpC((0, 0),
                     radius = 3,
                     edgecolor = 'k',
                     facecolor = 'None',
                     lw = 1))
        
    R = 45 / mS(91)
    
    #CAGDI
    ax.plot([0, 0, R, R/3, R/3],
            [-5, 5, 5, -5, 5],
            c = 'k',
            ls = ":",
            lw = 1)
    #BFH
    ax.plot([0, 2*R/3, 2*R/3],
            [0, 0, 5],
            c = 'k',
            ls = ":",
            lw = 1)
    
    x = 3 / mS(1 + R**2/225)
    y = x * -R/15
    
    #BE (r)
    ax.plot([0, x],
            [0, y],
            c = colors[1],
            lw = 2)
    #DJ (h)
    ax.plot([R/3, R/3],
            [-5, 0],
            c = colors[3],
            lw = 2)
    #AG (R)
    ax.plot([0, R],
            [5, 5],
            c = colors[5],
            lw = 4)
    #BDG (light)
    ax.plot([0, R/3, R],
            [0, -5, 5],
            c = colors[0],
            lw = 2)    
    
    ax.scatter([0, 0, 0, R/3, R/3, R/3, x, 2*R/3, 2*R/3, R],
               [5, 0, -5, 5, 0, -5, y, 5, 0, 5],
               lw = 5,
               color = 'k',
               zorder = 3)
    
    text = [("A", (-0.2, 4.8), 'k', 15, 0),
            ("B", (-0.2, 0), 'k', 15, 0),
            ("C", (-0.2, -4.9), 'k', 15, 0),
            ("D", (R/3-0.2, -4.9), 'k', 15, 0),
            ("E", (x+0.2, y), 'k', 15, 0),
            ("F", (2*R/3+0.2, 0), 'k', 15, 0),
            ("G", (4.8, 4.8), 'k', 15, 0),
            ("H", (2*R/3+0.2, 4.8), 'k', 15, 0),
            ("I", (R/3-0.2, 4.8), 'k', 15, 0),
            ("J", (R/3-0.15, 0.15), 'k', 15, 0),
            ("h", (R/3-0.25, -2.5), colors[3], 40, 90),
            ("r", (R/3-0.25, -0.7), colors[1], 40, -18),
            ("R", (R/2, 4.65), colors[5], 40, 0)]
    
    for t in text :
        plt.annotate(text = t[0],
                     xy = t[1],
                     c = t[2],
                     size = t[3],
                     ha = 'center',
                     va = 'center',
                     rotation = t[4],
                     zorder = 4)
        
    fig.savefig('2026.01.16.png', bbox_inches = "tight");

plotHelper()
In [4]:
for r in range(1, 200) :
    for h in range(r, 400) :
        R = 3*h*r / mS(4*h**2-r**2)
        if R == int(R) and h > r :
            print(h, r, R)
52 40 65.0
85 80 136.0
104 80 130.0
200 112 175.0
156 120 195.0
170 160 272.0
208 160 260.0
Rohan Lewis¶

2026.01.19¶