如何使此函数确保返回的坐标与其他坐标的距离最小



我在三维平面上绘制点,所以坐标是(X,Y,Z(,但高度Y将被硬编码,所以算法不必包括检查。

我目前绘制点的方式是,在挂载时,调用一个函数,根据随机角度的sin和cos生成随机坐标。这会导致重复和点非常接近。

我曾考虑将位置数组转换为一个集合以删除重复项,但这并不能解决递归检查每个点以确保最小距离的问题。

有人能帮我集思广益,或者在设计这个算法时提供一些指导吗。提前谢谢。

随机坐标算法

恐怕确保最小距离的唯一方法是相互检查每个点。

为此,您可以设置一个空数组,并在for循环中调用一个函数,该函数生成一个随机的x,y,[z]位置,用于检查从该点到数组中所有点的距离。如果该检查没有失败,则最终将该点放入数组中。

这里有一个简单的例子:

class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
}
var points = [];
var numberOfPoints = 10;
var minDistance;
var context = document.getElementById("canvas").getContext("2d");
function randomize() {
minDistance = parseInt(document.getElementById("minDistanceBox").value);
points = [];
for (var a = 0; a < numberOfPoints; a++) {
points.push(getRandomPoint());
}
context.fillStyle = "#dddddd";
context.fillRect(0, 0, 100, 100);
context.fillStyle = "#ff0000";
points.forEach(element => {
context.beginPath();
context.arc(element.x, element.y, 4, 0, 2 * Math.PI, true);
context.fill();
});
}
function getRandomPoint() {
var tempPoint = new Point();
var tempPoint2;
var failed = false;
do {
failed = false;
tempPoint.x = parseInt(Math.random() * 100);
tempPoint.y = parseInt(Math.random() * 100);
for (var a = 0; a < points.length; a++) {
tempPoint2 = points[a];
if (Math.sqrt(Math.pow(Math.abs(tempPoint.x - tempPoint2.x), 2) + Math.pow(Math.abs(tempPoint.y - tempPoint2.y), 2)) < minDistance) {
failed = true;
}
}
}
while (failed);
return tempPoint;
}
randomize();

document.getElementById("button").addEventListener("click", randomize);
<canvas id="canvas" width="100" height="100"></canvas>
<br>
<button id="button">randomize</button>
<label for="minDist">Min distance (1-25):</label>
<input type="number" id="minDistanceBox" name="minDist" min="1" max="25" value="25">

Radarbob的评论给了我一个开始搜索的方向,在那里我偶然发现了这个:

https://www.mathopenref.com/coordcirclealgorithm.html

每次将角度增加一定的量可以消除重复的可能性,并在点之间创建相等的距离。

相关内容

最新更新