此方法有效,但效果非常慢。我认为其中一个问题可能是add_by
方法中的'eval'语句。
一些解释:每个节点对象都有三个相关属性,:x
,:y
和:neighbors
。 :x
和:y
是表示平面坐标的整数,:neighbors
是一个数组,节点存储在@nodes
数组中。目标是为k
中的每个节点@nodes
找到距离d
k
距离@neighbors
的节点,并将它们添加到k
数组中 def set_neighbors d
def add_by dim, d
dict = {}
@nodes.each{|k| dict[k] = []}
@nodes.each_index do |k|
up = k+1
down = k-1
while up < @nodes.length and ((eval '@nodes[k].'+ dim) - (eval '@nodes[up].'+dim)).abs <= d
dict[@nodes[k]].push(@nodes[up])
up += 1
end
while down >= 0 and ((eval '@nodes[k].'+ dim) - (eval '@nodes[down].'+dim)).abs <= d
dict[@nodes[k]].push(@nodes[down])
down -= 1
end
end
return dict
end
@nodes.sort_by{|k| k.x}
exis = add_by('x', d)
whys = add_by('y', d)
@nodes.each do |k|
neighbors = exis[k]&whys[k]
k.neighbors = neighbors.select{|j| planar_distance(j,k) <= d}
end
end
。
add_by
我的问题是,如果不重复x
和y
的{{1}}例程或使用eval,您将如何做到这一点?
答案 0 :(得分:3)
您可以使用@nodes[k].send dim.to_sym
来避免使用。
我不确定你的代码究竟在做什么,但也许有一些指示:
def set_neighbors d
@nodes.each do |node|
node.neighbors = @nodes.select do |n|
(node.x - n.x).abs <= d &&
(node.x - n.x).abs <= d &&
planar_distance(n,node) <= d
end - node
end
end
答案 1 :(得分:2)