我正在使用2D阵列来处理游戏中的对象。阵列的尺寸就像笛卡尔网格上的坐标。当玩家选择一个点我想从阵列中收集N个最近的网格单元格时,即使该点不是有效的数组索引。
实施例: 从[0,0]到[10,10]的数组 如果玩家选择(-1,-1),N = 3,则最近的点将是[(0,0),(0,1),(1,0)]
蛮力方法是计算所选点与每个阵列网格单元之间的欧氏距离,将其放入列表中,然后进行排序。对于非常大的阵列,这可能是性能过高的。有没有更贪婪的方法来做到这一点,例如,我知道N是什么?
我知道如果所选择的点位于网格中,我们可以使用圆形公式来获得一个粗略的区域来检查,例如N / Pi = R ^ 2。我们可以检查此R值在x和y维度中创建的平方,这要快得多。
但是当选择的点靠近网格的边缘时呢?或者关闭它?或者如果你想忽略某些网格单元?
答案 0 :(得分:0)
我首先找到最接近给定点的小数坐标(即不一定是整数)的点。如果只有一个坐标在网格范围之外,那么只需将此坐标设置为最近的范围内坐标。如果两个坐标都在网格范围之外,那么最近的点将是其中一个角。
鉴于起点,您需要找到具有整数坐标的N个点。如果最近的点是一个角,它已经有整数坐标。否则,最近点是最近点两侧的网格点之一。
您知道其他N-1点将连接到最近的网格点,因为您正在计算两个凸形状的交点 - 圆形和矩形。我会按距离排列一堆点。从最近的网格点的邻居开始。重复删除最接近网格外原点的堆中的点,并将其邻居放入堆中(如果它们不存在),直到你提取了其他N-1个点为止。