我正在尝试制作一个可以解决的功能 最小斜率差的两个坐标。
具体来说, 输入数据是:
standard_dot
(一个数组),例如[0,0] other_dots
(一个由7个数组组成的数组),例如[[1,2],[2,3],[3,4],[4,5],[5,6],[6,7],[7,8]] 函数'calculate_min_dif'可以做下一件事:
standard_dot
中other_dots
和7个点之间的斜率。 def calculate_min_dif(standard_dot, other_dots)
index = 0
slope_list = Array.new(7)
other_dots.each do |dot|
slope_list[index] = (( standard_dot[1]-dot[1] ) / (standard_dot[0]-dot[0] )).abs
index = index + 1
end
result = slope_list.index(slope_list.combination(2).min_by { |a,b| (a-b).abs })
return result
end
编译器说问题在第6行
nil can't be coerced into Fixnum
(repl):6:in `-'
(repl):6:in `block in calculate_min_dif'
(repl):6:in `combination'
(repl):6:in `each'
(repl):6:in `min_by'
(repl):6:in `calculate_min_dif'
表示-
的右侧,b
的值为nil
我无法弄清楚为什么......
对不起,如果我太傻了。我是Ruby和英语的新手(有点......) Thanxx
答案 0 :(得分:2)
你可以这样做。我将把它留给其他人来解释你收到错误信息的原因。
base_pt = [0,0]
pts = [[1,2],[2,3],[3,4],[4,5],[5,6],[6,7],[7,8]]
def slope((x,y), (bpt_x, bpt_y))
((y - bpt_y).to_f/(x - bpt_x)).round(5)
end
def slope_diff(pt1, pt2, base_pt)
(slope(pt1, base_pt)-slope(pt2, base_pt)).abs
end
pts.combination(2).min_by { |pt1, pt2| slope_diff(pt1, pt2, base_pt) }
#=> [[6, 7], [7, 8]]
让我们检查斜坡。
pts.each_with_object({}) { |pt, h| h[pt] = slope(pt, base_pt).round(5) }
#=> {[1, 2]=>2.0, [2, 3]=>1.5, [3, 4]=>1.33333, [4, 5]=>1.25,
# [5, 6]=>1.2, [6, 7]=>1.16667, [7, 8]=>1.14286}
您可以看到经过base_pt
和点[6, 7]
和[7, 8]
的线在斜率上具有最小的绝对差异。