如何解决在一个区域里坐标随机分布的问题?

发布于 2022-09-12 03:36:11 字数 350 浏览 30 评论 0

比如这样一个区域横向坐标-100到100,纵向坐标-100到100
在有一个length为100的数组,每个数组项为{x:'坐标',y:'坐标'},
如何让这一百的点随机分布(像一个圆那样展开,密集程度较均匀,不要,一些区域太密集了,一些区域太分散了),且还有不重叠(均匀分布)?
那位大佬给个演示
大概这样的分布
这里有python的写法
那位大大可以把这个改成js的吗?
image.png

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

静谧幽蓝 2022-09-19 03:36:11

没明白你说的“均匀分布”是什么意思,如果是每个点的横纵坐标不相同,那么可以这么做。

已知 -100~100 共 201 个数字,那么可以弄两个数组分别表示 X、Y 轴坐标,随机打乱顺序,每次取一组即可:

const arrX = Array.from({ length: 201 }, (e, i) => i - 100)
    .sort((a, b) => Math.random() > .5 ? -1 : 1);
const arrY = Array.from({ length: 201 }, (e, i) => i - 100)
    .sort((a, b) => Math.random() > .5 ? -1 : 1);

const result = [];
for (let i = 0; i < 100; i ++) {
    result.push({ x: arrX[i], y: arrY[i] });
}

console.log(result);

执行结果:

image.png


针对问题修改后的补充:

什么叫 “像一个圆那样展开”?你把结果图画出来。

另外如果真是一个圆形分布,那也不可能是随机的啊?


针对第二次问题修改后的补充:

你给的 Python 代码里坐标点可以是小数的,我不知道你是可以接受小数还是只能是整数。我给了个只能是要整数的例子,如果要小数你就自己把 parseInt 删掉。

绘制效果在最下面,因为 100*100 比较小,所以我做了放大 2.5 倍的处理。

function getRandomCirclePoints(radius = 100) {
    while (true) {
        let xPos = parseInt(-radius + Math.random() * radius * 2);
        let yPos = parseInt(-radius + Math.random() * radius * 2);

        if (Math.sqrt(Math.pow(xPos , 2) + Math.pow(yPos, 2)) <= radius) {
            return { x: xPos, y: yPos };
        }
    }
}

const RADIUS = 100; // 半径
const LENGTH = 100; // 点的数量
const result = [];
for (let i = 0; i < LENGTH; i++) {
    const pos = getRandomCirclePoints(RADIUS);

    if (result.some(e => e.x === pos.x && e.y === pos.y)) {
        i--;
        continue;
    }
    
    result.push(pos);
}

console.log(result);

image.png

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文