如何创建随机非重叠坐标?

Mor*_*rem 2 algorithm geometry coordinates rust

我正在尝试创建一个函数,它将生成一个vec长度n,在一些边界之间具有随机xy类型坐标.具有这种坐标的每个点必须彼此具有最小距离.我正在尝试使用该功能,但我被卡住了.我应该使用特定的发行版还是添加一些过滤器或条件来实现这一目标?f64(-b, b)dthread_rng()

extern crate rand; // 0.5.5

use rand::prelude::*;
use rand::distributions::Standard;

pub fn apply_random_pos(n: usize, min_distance: f64) -> Vec<(f64, f64)> {
    let mut rng = thread_rng();
    let mut x: f64;
    let mut y: f64;

    let mut positions: Vec<(f64, f64)> = Vec::with_capacity(n);

    positions = thread_rng()
        .sample_iter(&Standard)
        .take(n)
        .collect::<Vec<(f64, f64)>>();

    positions
}
Run Code Online (Sandbox Code Playgroud)

MBo*_*MBo 5

大量点的算法草图(但分布与网格相关):

在您所在的地区建立方格.选择单元格Size = 3*MinDist.所以你(Width * Height) / (9 * MinDist^2)有点网站.

添加新点时,选择随机自由站点并将点放置在网格结中,然后-Mindist..MinDist在两个方向上随机更改其位置.单元格大小3保证没有点太靠近.

生成示例:一半的站点在左侧图片中占用,所有站点都在右侧占用

在此输入图像描述在此输入图像描述

为了获得更好的"随机外观",您可以使单元格大小更小 - 例如2*MinDist,但在这种情况下,您必须检查邻居站点 - 但只有四个而不是全部.