Books · The Fiddler: Solutions
Chapter 25
Can You Topple the Tower?
A block tower is a solid rectangular prism of height on a square base of side . A second prism of the same material, with a base by and height , is fixed to the top half of the first block, sticking out to one side as an overhang. When grows past some value, the tower topples. What is that critical length ?
The Fiddler, Zach Wissner-Gross, December 12, 2025(original post)
Solution
Take the ground edge of the base as and the far edge as ; the overhang juts out to . The tower tips when the combined centre of mass passes the supporting edge . Density is uniform, so mass is volume: the lower block has mass with its centre at , and the overhang has mass with its centre at . Height does not enter, since toppling about a horizontal edge depends only on the horizontal position of the centre of mass. Setting that position to the pivot, So the tower topples once
The computation
Solve the toppling condition itself: set the combined centre of mass (mass at , mass at ) equal to the pivot and solve for .
from sympy import symbols, solve
L = symbols('L', positive=True)
print(solve((2*0.5 + L*(1 + L/2)) - 1*(2 + L), L)) # [sqrt(2)]
Extra Credit
Now the tower is an annular sector: the region between two arcs of angle on circles of radius and . For small it rests happily on one of its two flat radial faces; past some angle it can no longer balance on a flat face. What is that critical ?
Solution
Rest the sector on its radial face along the -axis from to , the body curving up through angles to . Using polar coordinates with area element , the horizontal centre of mass is As this is , safely inside the face ; balance is lost when reaches the inner edge , that is when , whose positive root is
The computation
Integrate the sector’s geometry directly: for each compute the horizontal centroid on a polar grid, then root-find the angle at which it slips back to the inner edge .
import numpy as np
from scipy.optimize import brentq
def centroid_x(theta):
r = np.linspace(1, 2, 500); phi = np.linspace(0, theta, 500)
R, PHI = np.meshgrid(r, phi); w = R # area element r dr dphi
return (R*np.cos(PHI)*w).sum()/w.sum()
theta = brentq(lambda t: centroid_x(t) - 1, 0.5, 3.0)
print(round(theta, 3), round(np.degrees(theta), 1)) # 1.555 89.1