-2

我在 3D 平面上绘制点,因此坐标为 (X,Y,Z),但高度 Y 将被硬编码,因此算法不必包括检查。

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

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

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

随机坐标算法

4

2 回答 2

0

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

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

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

于 2020-09-02T22:42:24.253 回答
0

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

为此,您可以设置一个空数组并在 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">

于 2020-09-02T20:20:25.683 回答