Move the species along the seed-size gradient and watch Lotka-Volterra competition decide who coexists, who is excluded, and how beaks can drift apart.
Species 1 sits at the resource peak (seed size 0), species 2 at the separation set by your slider. Sweeps the niche width from narrow to wide and finds where species 2 disappears.
The science
Competition model. For species i with density N_i: dN_i/dt = r N_i (1 - sum_j a_ij N_j / K_i). The competition coefficient comes from niche overlap: if species use seed size x with Gaussian utilisation curves of width s, a_ij = exp(-(x_i - x_j)^2 / (4 s^2)) (the overlap integral of two Gaussians divided by the self-overlap). Seed supply is Gaussian with width sK, so a species centred at x_i has carrying capacity K_i = K0 exp(-x_i^2 / (2 sK^2)).
Coexistence rule. For two species, both persist if and only if a_12 < K_2/K_1 and a_21 < K_1/K_2. If species 1 sits at the resource peak and species 2 at distance d, this reduces to exp(-d^2/4s^2) < exp(-d^2/2sK^2), i.e. s < sK / sqrt(2) regardless of d: narrow niches coexist, wide ones lose the weaker species (competitive exclusion, Gause's principle). The page tests this threshold numerically.
Equilibrium. When all species persist, sum_j a_ij N_j* = K_i, a linear system solved exactly by Gaussian elimination and compared with the long-time Runge-Kutta result. A lone species obeys the logistic solution N(t) = K / (1 + (K/N0 - 1) e^(-r t)), also checked.
Character displacement. With evolution speed mu above zero, each preferred seed size moves uphill on its own per-capita growth rate, dx_i/dt = mu df_i/dx_i with f_i = r(1 - sum_j a_ij N_j / K_i). Competitors then push each other apart while the resource peak pulls them inward, the textbook pattern seen in Darwin's finches. This is an adaptive-dynamics caricature, not a genetic model: no mutation, no sexual reproduction, no drift.
Honest simplifications. Gaussian niches and resource supply; densities are continuous; one resource axis (seed size) and no seasons, predators, or seed regrowth dynamics; all species share one growth rate r; time is in units of 1/r, not days. Beak sizes in the 3D models are stylised and drawn larger than life; the drawn bird counts are proportional to density (about 1 bird per 4 units) and positions are quantiles of each utilisation curve, not individual tracking. Real finch ecology (for example the Galapagos record) is more complicated.
Model and assets: Blender (island, finches, seeds, acacia) + Three.js. Independent educational model.