Books · The Fiddler: Solutions
Chapter 14
Can You Trace the Locus?
I have a loop of string whose total length is . I place it around a unit disk (radius ) and pull a point on the string away from the disk until the string is taut. I then drag this point around the disk in all directions, always keeping the string taut, so the point traces out a loop. What is the area inside this loop?
The Fiddler, Zach Wissner-Gross, March 20, 2026(original post)
Solution
Pulled taut to a point , the string hugs the far side of the disk and runs straight along the two tangent lines to . That shape is exactly the boundary of the convex hull of the disk together with , so the string’s length is the perimeter of that hull: the far arc plus the two tangent segments. If lies at distance from the centre, each tangent has length , and the near arc of measure is replaced by the tangents, leaving This depends only on , so for a fixed string length the distance is the same in every direction: the traced loop is a circle centred at the disk’s centre. Setting , and the enclosed area is
The computation
Solve the taut-string condition: find the tangent length at which the convex-hull perimeter equals the string length , then the traced circle has radius and area .
from math import atan, pi
from scipy.optimize import brentq
x = brentq(lambda x: 2*x - 2*atan(x) - (10 - 2*pi), 0.1, 100)
print(round(pi * (1 + x*x), 4)) # 33.7023
Extra Credit
Now the loop of string has length , and I place it around two adjacent unit disks before pulling a point taut and dragging it around. What is the area inside the traced loop?
Solution
The two touching disks have, as their convex hull, a stadium: two unit semicircles joined by straight sides of length . The taut string still traces the boundary of the convex hull of the obstacle and the point , so the loop is the set of points for which that hull has perimeter . The stadium is not a circle, so the loop is not one either, and the area has no tidy closed form. Tracing it numerically gives
The computation
Build the two-disk obstacle as points. In each direction, root-find the distance at which the convex hull of the obstacle plus the pulled point has perimeter ; that locus of points is the traced loop, and the shoelace formula gives its area.
import numpy as np
from scipy.spatial import ConvexHull
from scipy.optimize import brentq
def disk(cx, n=2000):
t = np.linspace(0, 2*np.pi, n, endpoint=False)
return np.c_[cx + np.cos(t), np.sin(t)]
K = np.vstack([disk(-1), disk(1)]) # unit disks, centres (-1,0),(1,0)
def perim(P):
w = np.vstack([K, P]); v = w[ConvexHull(w).vertices]
return np.linalg.norm(np.diff(np.vstack([v, v[0]]), axis=0), axis=1).sum()
pts = []
for a in np.linspace(0, 2*np.pi, 720, endpoint=False):
r = brentq(lambda r: perim([r*np.cos(a), r*np.sin(a)]) - 14, 2, 60)
pts.append([r*np.cos(a), r*np.sin(a)])
p = np.array(pts)
print(round(0.5*abs((p[:, 0]*np.roll(p[:, 1], -1)
- np.roll(p[:, 0], -1)*p[:, 1]).sum()), 2)) # 52.36