围绕一点获得坐标

时间:2014-05-28 09:12:57

标签: ruby

我很难找到一个好的算法来获取坐标系中一个点(包括中点)周围的所有点。

示例:

  1 1   2 1   3 1

  1 2   2 2   3 2

  1 3   2 3   3 3

我有上面的网格,例如,如果我输入: get_around_coordinates(2,2,1)

它将返回一个看起来像这样的数组 [[1,1],[2,1],[3,1],[1,2],[2,2],[2,3],[3,1],[3,2],[ 3,3]]

这就是我的方法的样子:

 def get_around_coordinates(px, py, radius)
    coord = []
    start_x = px - radius
    start_y = py - radius
    (radius * 2 + 1).times do |x|
      (radius * 2 + 1).times do |y|
        coord.push([start_x + x, start_y + y])
      end
    end
    return coord
  end

我希望有人能给我更好的东西。

2 个答案:

答案 0 :(得分:10)

使用Array#product

def get_around_coordinates(px, py, radius)
  xs = (px - radius..px + radius).to_a
  ys = (py - radius..py + radius).to_a
  xs.product(ys)
end

现在让我们假设Ruby缺少这种方法。功能方法是OOP列表理解(flat_map + [flat_map ...] + map):xs.flat_map { |x| ys.map { |y| [x, y] } }

答案 1 :(得分:0)

一种相当粗略的方法

  def neighborhood(x=0, y=0, radius)
    (x-radius..x+radius).reduce([]) { |neighbors, x1|
      (y-radius..y+radius).each { |y1| neighbors << [x1, y1] }
      neighbors
    }
  end