Library · Geometric Probability · Chapter 30
A triangle in the disc that contains the centre
Problem 30.1
Three points are chosen independently and uniformly in the closed unit disc. What is the probability that the triangle they form contains the centre of the disc?
Solution. Write each random point in polar coordinates: is the distance from the origin (density on ), and is the angle (uniform on , independent of ).
The key observation: the event “origin inside triangle” depends only on the angles , not on the radii .
Why. The origin lies inside iff there is no half-plane through with all three vertices on one side. For the half-plane with normal direction , the vertex is on the “positive” side iff , a condition that depends only on (the radius does not affect the sign). Hence origin inside the triangle iff the three angles do not all lie in any semicircle of the circle .
Since are iid uniform on , this is precisely the event studied in Chapter 25 (three uniform points on a circle that fail to all lie in any semicircle), with probability . Therefore
The probability is the same whether the three points are sampled on the boundary circle (Chapter 25) or uniformly in the interior of the disc. In both cases the answer depends only on the angular coordinates, which are uniformly distributed regardless of whether the radii are fixed (on the boundary) or random (in the interior). This is a useful reduction in the theory of random convex hulls.
More generally: for iid uniform random points in any rotationally-symmetric planar region (disc, annulus, etc.), the probability that the origin lies in the convex hull equals the probability that iid uniform random points on do not all lie in a semicircle, i.e., .
import numpy as np
# 3 uniform points in unit disc; check if origin is in triangle via signed-area.
r = np.sqrt(np.random.rand(3, 10**7))
t = np.random.rand(3, 10**7) * 2*np.pi
x, y = r*np.cos(t), r*np.sin(t)
s_tri = (x[1]-x[0])*(y[2]-y[0]) - (x[2]-x[0])*(y[1]-y[0])
s01, s12, s20 = x[0]*y[1]-x[1]*y[0], x[1]*y[2]-x[2]*y[1], x[2]*y[0]-x[0]*y[2]
cont = (np.sign(s_tri)==np.sign(s01)) & (np.sign(s_tri)==np.sign(s12)) & (np.sign(s_tri)==np.sign(s20))
print(f"sim: {cont.mean():.5f} exact: 0.25")
# sim: 0.25027 exact: 0.25