Library · Geometric Probability · Chapter 58

Cauchy’s shadow formula

Revised Report an error

Problem 58.1

Let KK be a convex body in R3\mathbb{R}^3 with surface area SS. For a direction d\mathbf{d} chosen uniformly on the unit sphere, let A(d)A(\mathbf{d}) be the area of the shadow of KK onto a plane perpendicular to d\mathbf{d}. What is E[A(d)]\mathbb{E}[A(\mathbf{d})]?

Solution. Write the boundary of KK as ∂K\partial K. At each point x∈∂Kx \in \partial K, let n(x)\mathbf{n}(x) be the outward unit normal. For a direction d\mathbf{d}, a boundary element at xx is sun-facing (visible to a light source at infinity in the direction −d-\mathbf{d}) iff n(x)⋅d>0\mathbf{n}(x) \cdot \mathbf{d} > 0. Each sun-facing element contributes n(x)⋅d dA(x)\mathbf{n}(x) \cdot \mathbf{d} \, dA(x) to the area of the shadow, since its orthogonal projection onto the shadow plane has that size. Hence A(d)=∫∂K,  n⋅d>0n(x)⋅d dA(x)=∫∂Kmax⁡ ⁣(n(x)⋅d,0) dA(x).A(\mathbf{d}) = \int_{\partial K,\; \mathbf{n} \cdot \mathbf{d} > 0} \mathbf{n}(x) \cdot \mathbf{d} \, dA(x) = \int_{\partial K} \max\!\big( \mathbf{n}(x) \cdot \mathbf{d}, 0 \big) \, dA(x).

Average over d\mathbf{d} uniform on the sphere S2S^2 and exchange the order of integration (Fubini): Ed[A(d)]=∫∂KEd[max⁡(n(x)⋅d,0)] dA(x).\mathbb{E}_{\mathbf{d}}[A(\mathbf{d})] = \int_{\partial K} \mathbb{E}_{\mathbf{d}}[\max(\mathbf{n}(x) \cdot \mathbf{d}, 0)] \, dA(x).

For a fixed unit vector n\mathbf{n}, the quantity n⋅d\mathbf{n} \cdot \mathbf{d} is the cosine of the angle between n\mathbf{n} and d\mathbf{d}. For d\mathbf{d} uniform on the sphere, this angle θ\theta has density 12sin⁡θ\tfrac12 \sin \theta on [0,π][0, \pi] (the standard spherical Jacobian). Hence Ed[max⁡(n⋅d,0)]=∫0π/2cos⁡θ⋅12sin⁡θ dθ=12⋅12=14.\mathbb{E}_{\mathbf{d}}[\max(\mathbf{n} \cdot \mathbf{d}, 0)] = \int_0^{\pi/2} \cos \theta \cdot \tfrac12 \sin \theta \, d\theta = \tfrac12 \cdot \tfrac12 = \tfrac14.

Therefore E[A(d)]=14⋅∫∂KdA=S4.\boxed{\mathbb{E}[A(\mathbf{d})] = \tfrac14 \cdot \int_{\partial K} dA = \frac{S}{4}.} In particular, the unit cube (surface area S=6S = 6) casts an expected shadow of area 64=32\tfrac{6}{4} = \tfrac32. ■

Cauchy’s shadow formula. A unit cube projects onto a plane perpendicular to a direction \mathbf{d} on the unit sphere; the shadow is a hexagon (generically) whose area depends on \mathbf{d} . Averaged uniformly over \mathbf{d} , the expected shadow area is \tfrac14 of the cube’s surface area, which
Cauchy’s shadow formula. A unit cube projects onto a plane perpendicular to a direction d\mathbf{d} on the unit sphere; the shadow is a hexagon (generically) whose area depends on d\mathbf{d}. Averaged uniformly over d\mathbf{d}, the expected shadow area is 14\tfrac14 of the cube’s surface area, which is 32\tfrac32.

Cauchy’s formula is the three-dimensional analogue of the fact that the average width of a convex plane curve equals its perimeter divided by π\pi. In general dimension dd, Cauchy’s surface-area formula concerns projections onto (d−1)(d-1)-dimensional hyperplanes: their average volume is a universal multiple of the body’s surface area. Lower-dimensional projection averages involve the corresponding intrinsic volumes, rather than surface area.

import numpy as np
from scipy.spatial import ConvexHull
# For each uniform random direction d, project the 8 unit-cube vertices onto
# a plane perpendicular to d and compute the area of their convex hull.
N = 10**4
d = np.random.randn(3, N); d /= np.linalg.norm(d, axis=0)
verts = np.array([[x, y, z] for x in [-.5, .5]
                            for y in [-.5, .5]
                            for z in [-.5, .5]]).T      # 3 x 8
areas = np.empty(N)
for i in range(N):
    di = d[:, i]
    h = np.array([1.0, 0, 0]) if abs(di[0]) < 0.9 else np.array([0.0, 1, 0])
    e1 = np.cross(di, h); e1 /= np.linalg.norm(e1)
    e2 = np.cross(di, e1)
    proj = np.column_stack([verts.T @ e1, verts.T @ e2])
    areas[i] = ConvexHull(proj).volume  # 2D "volume" = area
print(f"sim: {areas.mean():.5f}   exact: 1.5")
# sim: 1.50060   exact: 1.5
Report an error on this page

Reports are stored by Netlify. See the privacy note.