Expected Triangle Area in a Disk

2026-01-27

Result

For three independent uniform points inside a disk of radius $R$,

$$ E[A]=\frac{35}{48\pi}R^2. $$

For the unit disk, $E[A]=35/(48\pi)$.

Illustration

Three random points and their triangle

(Generated by scripts/generate_expected_triangle_area_illustration.py.)

Setup and notation

Let $D_R=\{(x,y)\in\mathbb{R}^2:x^2+y^2\le R^2\}$ be the disk of radius $R$ (centered at the origin), with area $S=\pi R^2$.

Let $P_1,P_2,P_3$ be i.i.d. uniform random points in $D_R$. Write

$$ P_i=(X_i,Y_i), $$

and (when convenient) use the equivalent lower-case notation $(x_i,y_i)$ for coordinates of $P_i$.

In polar coordinates, we can write $P_i=(r_i\cos\theta_i,r_i\sin\theta_i)$, where to be uniform over area we may sample

$$ U_i\sim U[0,1],\quad r_i=R\sqrt{U_i},\quad \theta_i\sim U[0,2\pi), $$

independently for $i=1,2,3$.

Let $A$ be the (unsigned) area of the triangle with vertices $P_1,P_2,P_3$. By the shoelace formula,

$$ A=\frac12\left|X_1(Y_2-Y_3)+X_2(Y_3-Y_1)+X_3(Y_1-Y_2)\right|. $$

The point density is $f(P)=\frac{1}{\pi R^2}$ for $P\in D_R$ and $0$ otherwise.

Finally, for the outline below, let $E_{\text{in}}$ denote the unconditional expected area $E[A]$. Let $E_{1\_on\_bd}$ denote the expected area when one point is conditioned to lie on the boundary circle $\partial D_R$ (uniform in angle) and the other two points are uniform in $D_R$; similarly define $E_{2\_on\_bd}$ and $E_{3\_on\_bd}$.

Key ideas (outline)

  1. Uniform sampling in polar coordinates. To be uniform over area, $r=R\sqrt{U}$ with $U\sim U[0,1]$, and $\theta\sim U[0,2\pi)$, because $dA=r\,dr\,d\theta$.

  2. The direct integral is hard. Writing the area using the shoelace formula gives a six-dimensional integral with absolute value, which is tedious. The full expectation can be written as

    $$ E[A]=\int\!\!\int\!\!\int \frac{1}{2}\left|X_1(Y_2-Y_3)+X_2(Y_3-Y_1)+X_3(Y_1-Y_2)\right| \,f(P_1)f(P_2)f(P_3)\,dP_1\,dP_2\,dP_3, $$

    where $f(P)=\frac{1}{\pi R^2}$ on the disk and $0$ otherwise.

  3. Crofton-style dimensional reduction. Let $S=\pi R^2$ and $M=S^3=\pi^3R^6$ be the total configuration measure for three points. The weighted integral is $F(R)=M\cdot E[A]=\int_{D_R^3}A\,dP_1\,dP_2\,dP_3$, which scales as $R^8$. Differentiating:

    $$ F'(R)=\frac{8}{R}F(R). $$

    Increasing $R$ by $dR$ forces at least one point to lie on the boundary circle of length $L=2\pi R$, so

    $$ F'(R)=3\cdot L\cdot S^2\cdot E_{1\_on\_bd}. $$

    Equating gives $E_{\text{in}}=\frac{3}{4}E_{1\_on\_bd}$.

  4. Repeat the reduction. Moving points to the boundary iteratively yields the chain

    $$ E_{\text{in}}=\frac{3}{4}E_{1\_on\_bd},\qquad E_{1\_on\_bd}=\frac{5}{9}E_{2\_on\_bd},\qquad E_{2\_on\_bd}=\frac{7}{16}E_{3\_on\_bd}. $$
  5. Boundary condition. For three points on the circumference, $E_{3\_on\_bd}=\frac{3R^2}{2\pi}$ (a classic result).

  6. Combine.

    $$ E[A]=\left(\frac{3}{4}\right)\left(\frac{5}{9}\right)\left(\frac{7}{16}\right) \left(\frac{3R^2}{2\pi}\right)=\frac{35}{48\pi}R^2. $$

Quick Monte Carlo check (Python)

Monte Carlo area distribution

In the code below, the variables x1, y1, x2, y2, x3, y3 correspond to $X_1,Y_1,X_2,Y_2,X_3,Y_3$ in the notation above.

import numpy as np
import matplotlib.pyplot as plt

def calculate_expected_area(radius=1.0, num_samples=1_000_000):
    u = np.random.uniform(0, 1, (num_samples, 3))
    r = radius * np.sqrt(u)
    theta = np.random.uniform(0, 2 * np.pi, (num_samples, 3))

    x = r * np.cos(theta)
    y = r * np.sin(theta)

    x1, x2, x3 = x[:, 0], x[:, 1], x[:, 2]
    y1, y2, y3 = y[:, 0], y[:, 1], y[:, 2]

    areas = 0.5 * np.abs(x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2))
    simulated_mean = np.mean(areas)
    theoretical_mean = (35 / (48 * np.pi)) * (radius ** 2)
    return areas, simulated_mean, theoretical_mean

areas, sim, theo = calculate_expected_area(radius=1.0, num_samples=200_000)
print(f"Simulated mean: {sim:.6f}")
print(f"Theoretical mean: {theo:.6f}")

plt.figure(figsize=(6, 4))
plt.hist(areas, bins=60, density=True, color="#60a5fa", alpha=0.8)
plt.axvline(theo, color="#ef4444", linewidth=2, label="Theoretical mean")
plt.title("Triangle area distribution (unit disk)")
plt.xlabel("Area")
plt.ylabel("Density")
plt.legend()
plt.tight_layout()
plt.savefig("static/images/expected-triangle-area-plot.svg")
plt.show()