我在 3D 平面上绘制点,因此坐标为 (X,Y,Z),但高度 Y 将被硬编码,因此算法不必包括检查。
我目前绘制点的方式是在安装时,调用一个函数以根据随机角度的 sin 和 cos 生成随机坐标。这会导致重复和点非常接近。
我正在考虑将位置数组转换为一组以删除重复项,但这并不能解决递归检查每个点以确保最小距离的问题。
有人可以帮我集思广益,或者在设计这个算法时提供一些指导。提前致谢。
我在 3D 平面上绘制点,因此坐标为 (X,Y,Z),但高度 Y 将被硬编码,因此算法不必包括检查。
我目前绘制点的方式是在安装时,调用一个函数以根据随机角度的 sin 和 cos 生成随机坐标。这会导致重复和点非常接近。
我正在考虑将位置数组转换为一组以删除重复项,但这并不能解决递归检查每个点以确保最小距离的问题。
有人可以帮我集思广益,或者在设计这个算法时提供一些指导。提前致谢。
Radarbob 的评论给了我一个开始搜索的方向,我偶然发现了这个:
https://www.mathopenref.com/coordcirclealgorithm.html
每次将角度增加一定量会消除重复的可能性,并在点之间创建相等的距离。
恐怕确保最小距离的唯一方法是相互检查每个点。
为此,您可以设置一个空数组并在 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">