【发布时间】:2010-11-12 23:18:29
【问题描述】:
这种方法有效,但效果很慢。我认为问题之一可能是add_by 方法中的“eval”语句。
一些解释:每个Node对象都有三个相关的属性,:x、:y和:neighbors。 :x和:y是表示平面坐标的整数,:neighbors是一个数组,节点存储在@nodes数组中。目标是为@nodes 中的每个节点k 找到在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
我的问题是,如果不为 x 和 y 重复 add_by 例程或使用 eval,您将如何做到这一点?
【问题讨论】:
标签: ruby eval computational-geometry