Capacity Constrained Point Distributions, an algorithm by Michael Balzer, Thomas Schlömer & Oliver Deussen (University of Konstanz, Germany, 2009).
(Not sure I have implemented it correctly, but it seems to work, albeit slowly.)
Idea found on n-e-r-v-o-u-s.
I made variant with a Delaunay topology to get much faster results. It seems to work quite well in practice.
And here is also a data-based variant.
https://d3js.org/d3.v4.min.js