问题描述
我正在3D平面上绘制点,因此坐标是(X,Y,Z),但是高度Y将被硬编码,因此算法不必对此进行检查。
我当前绘制点的方式是在安装时,调用一个函数以基于随机角度的正弦和余弦生成随机坐标。这导致重复项和点真正靠近在一起。
我当时正在考虑将位置数组转换为一个集合以删除重复项,但这不会解决递归检查每个点以确保最小距离的问题。
有人可以帮助我集思广益,或在设计此算法时提供一些指导。预先感谢。
解决方法
恐怕确保最小距离的唯一方法是相互检查每个点。
为此,您可以设置一个空数组,并在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
每次将角度增加一定量将消除重复的可能性,并在点之间创建相等的距离。