选择最小斜率差的两个坐标

时间:2016-07-29 04:52:06

标签: ruby

我正在尝试制作一个可以解决的功能 最小斜率差的两个坐标。

具体来说, 输入数据是:

  1. standard_dot(一个数组),例如[0,0]
  2. other_dots(一个由7个数组组成的数组),例如[[1,2],[2,3],[3,4],[4,5],[5,6],[6,7],[7,8]]
  3. 函数'calculate_min_dif'可以做下一件事:

    1. 计算数组standard_dot other_dots和7个点之间的斜率。
    2. 选择一组斜率最接近的2个点
    3. 返回数组中这2个点的索引。
    4.    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

1 个答案:

答案 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]的线在斜率上具有最小的绝对差异。