【发布时间】:2018-01-13 18:14:00
【问题描述】:
我需要一个算法来给我坐标到最近的单元格(按距离顺序)到二维网格中的另一个单元格。它用于搜索算法,然后检查这些坐标是否适合各种事物。无论如何,到目前为止,我想出了这个:
function testy(cx, cy, idx) {
var radius = Math.floor(Math.sqrt(idx / Math.PI));
var segment = Math.round(idx - (radius * Math.PI));
var angle = segment / radius;
var x = Math.round(cx + radius * Math.cos(angle));
var y = Math.round(cy + radius * Math.sin(angle));
return [x, y];
}
addEventListener("load", function() {
var canv = document.createElement("canvas");
document.body.appendChild(canv);
canv.width = 800;
canv.height = 600;
var ctx = canv.getContext("2d");
var scale = 5;
var idx = 0;
var idx_end = 10000;
var func = function() {
var xy = testy(0,0,idx++);
var x = xy[0] * scale + canv.width / 2;
var y = xy[1] * scale + canv.height / 2;
ctx.rect(x, y, scale, scale);
ctx.fill();
if (idx < idx_end) setTimeout(func, 0);
}
func();
});
但正如您所知,它有点废话,因为它跳过了一些单元格。我在那里做了一些假设:
某个半径的圆的周长对应于该圆路径上的单元数。我不认为这是一个太大的问题,因为半径中的实际单元数应该低于导致重复的圆周(少量是可以的)但不是排除(不可以)。
指定的第 n 个索引的圆的半径将略大于 Math.floor(Math.sqrt(idx / Math.PI)),因为半径每增加 1 对应于 2 * Math.PI 被添加到圆的圆周上。同样,应该会导致轻微的重复,但不能排除。
除此之外,我不知道它可能出了什么问题,我在比这更复杂的数学上失败了,所以可能与此有关。
也许已经有另一种这样的算法了?一个不跳过单元格的?语言无关紧要,我是用 js 来做原型的,但它可以是任何东西。
【问题讨论】:
-
你的目标不明确。您是否想要所有网格点的列表(或生成器),使它们与给定点的距离越来越远?上市期间距离必须增加还是可以稍微减少?从给定点取“螺旋”图案是否有问题,其中点取自垂直和水平线段,但基本图案离给定点更远? (最后一个很容易编程,似乎足以满足大多数搜索。)
-
我认为 stackoverflow.com/questions/3706219/… 是您真正想要的。