如何创建随机的不重叠坐标?

时间:2018-09-21 09:39:51

标签: algorithm rust geometry coordinates

我正在尝试创建一个函数,该函数将生成长度为reflect.ValueOf(myStruct).Interface().(newType) 的{​​{1}},并且在某些位置之间具有随机vecn类型为x的坐标边界y。具有此类坐标的每个点之间的最小距离必须为f64。我正在尝试使用(-b, b)函数,但是遇到问题。我应该使用特定的发行版还是添加一些过滤器或条件来实现这一目标?

d

3 个答案:

答案 0 :(得分:5)

为更大数量的点绘制算法(但分布与网格相关):

在您的区域上建立正方形网格。选择单元格Size = 3*MinDist。因此,您有(Width * Height) / (9 * MinDist^2)个点站点。

添加新点时,请在网格结中选择随机的自由位置和放置点,然后在两个方向的-Mindist..MinDist范围内随机更改其位置。像元大小3保证没有点太靠近。

生成示例:左侧图片占据了一半的网站,右侧图片占据了所有网站

enter image description here enter image description here

要获得更好的“随机外观”,可以减小像元大小,例如2*MinDist,但是在这种情况下,您必须检查邻居站点-但只能检查其中四个而不是全部。

答案 1 :(得分:3)

您可以使用幼稚的算法:虽然生成的点不正确,请尝试另一个:

extern crate rand;
use rand::prelude::*;

pub fn apply_random_pos(n: usize, min_distance: f64, boundary: f64) -> Vec<(f64, f64)> {
    fn distance(p1: (f64, f64), p2: (f64, f64)) -> f64 {
        ((p1.0 - p2.0).powf(2.) + (p1.1 - p2.1).powf(2.)).sqrt()
    }

    let mut rng = thread_rng();
    let mut positions = Vec::with_capacity(n);

    while positions.len() < n {
        let p1 = (
            rng.gen_range(boundary, -boundary),
            rng.gen_range(boundary, -boundary),
        );
        if positions.iter().all(|&p2| distance(p1, p2) > min_distance) {
            positions.push(p1);
        }
    }
    positions
}

请注意,此算法根本不适用于许多点。这甚至是最糟糕的算法。

答案 2 :(得分:0)

我使用了@Boiethios' answer和一些附加功能,它似乎可以按我的意愿工作。唯一的小问题是,我还没有想到过输出包含负数的更具体范围的方法

veins_inet