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

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

回答

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

已知 -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

以上是 如何解决在一个区域里坐标随机分布的问题? 的全部内容, 来源链接: utcz.com/a/31067.html

回到顶部