Source code for foxes.utils.random_xy
import numpy as np
from scipy.spatial.distance import cdist
[docs]
def random_xy_square(
n,
min_dist=500,
xmax_ini=None,
growth=1.02,
seed=None,
verbosity=1,
):
"""
Creates random xy positions within a square,
with mean (0, 0)
Parameters
----------
n: int
The number of positions
min_dist: float
The minimal distance between any two positions
xmax_ini: float, optional
The initial maximal distance of any coordinates
growth: float
The growth factor of the initial radius, must be
greater 1
seed: int, optional
The random seed
verbosity: int
The verbosity level. 0 = silent
Returns
-------
xy: numpy.ndarray
The positions, shape: (n, 2)
:group: utils
"""
if seed:
np.random.seed(seed)
xmax = np.sqrt(n) * min_dist if xmax_ini is None else xmax_ini
xy = np.random.uniform(0, xmax, (n, 2))
while True:
dists = cdist(xy, xy)
np.fill_diagonal(dists, np.inf)
sel = np.unique(np.where(dists < min_dist)[0])
if not len(sel):
break
if verbosity > 0:
print(f"Re-generating coordinates: {len(sel)}, xmax = {xmax:.1f}")
xmax *= growth
xy[sel] = np.random.uniform(0, xmax, (len(sel), 2))
return xy - np.mean(xy, axis=0)[None, :]