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

问题描述

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

我当前绘制点的方式是在安装时,调用一个函数以基于随机角度的正弦和余弦生成随机坐标。这导致重复项和点真正靠近在一起。

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

有人可以帮助我集思广益,或在设计此算法时提供一些指导。预先感谢。

Random cooordinate algorithm

解决方法

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

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

这是一个简单的例子:

ARG POSTGRES=12


FROM postgis/postgis:$POSTGRES-2.5




COPY /init_db.sh /docker-entrypoint-initdb.d/


ENV PG_COLLKEY_VERSION 0.5.1

RUN apt-get update --quiet=2 \
  && apt-get install --quiet=2 \
    build-essential \
    ca-certificates \
    libicu-dev \
    postgresql-server-dev-$PG_MAJOR \
    pgxnclient \
    unzip \
  && pgxnclient download --yes --target ~ pg_collkey=${PG_COLLKEY_VERSION} \
  && unzip ~/pg_collkey-${PG_COLLKEY_VERSION}.zip -d ~/ \
  && cd ~/pg_collkey-${PG_COLLKEY_VERSION} \
  && mv Makefile Makefile.orig \
  && sed '/^DATA = \$(wildcard/d' Makefile.orig > Makefile \
  && make \
  && make install \
  && cp -v ~/pg_collkey-${PG_COLLKEY_VERSION}/pg_collkey--${PG_COLLKEY_VERSION}.sql /usr/share/postgresql/$PG_MAJOR/extension/ \
  && apt-get remove -qqy \
    build-essential \
    ca-certificates \
    libicu-dev \
    postgresql-server-dev-$PG_MAJOR \
    pgxnclient \
    unzip \
  && rm -rf \
    /var/lib/apt/lists/* \
    /tmp/* \
    /var/tmp/*
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,100,100);
  context.fillStyle = "#ff0000";
  points.forEach(element => {
    context.beginPath();
    context.arc(element.x,element.y,4,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);

,

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

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

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...