仅在索引存在时编辑索引

Sha*_*aun 5 ruby arrays class multidimensional-array

我需要创建一个0和1的2D网格来表示图像,并创建一个模糊方法,将1(左,右,上或下)旁边的任何0更改为1,如下所示:

0000 => 0000
0000    0010
0010    0111
0000    0010
Run Code Online (Sandbox Code Playgroud)

接下来,我必须允许用户传入一个允许模糊在每个方向上扩展多个空格的数字.如果我打电话image.blur(2),它会在每个方向上延伸2个空格,但是每个第一步都必须再次调用模糊以考虑对角线.例如:

00000000 => 00010000
00000000    00111000
00010000    01111100
00000000    00111000
00000000    00010000
Run Code Online (Sandbox Code Playgroud)

这是我的代码.

class Image
  attr_accessor :picture
  def initialize(*rows)
    @picture = *rows
  end
  def output_image
    @picture.each_index do |i|
      puts @picture[i].join
    end
  end
  def blur(distance=1)
    @blurred_image = Array.new(@picture.length, 0) {Array.new(@picture[0].length, 0)} #create new array of zeroes the size of @picture
    @picture.each_index do |i|
      @picture[i].each_index do |j|
        if @picture[i][j] == 1
          @blurred_image[i][j]   = 1 if @blurred_image[i][j] 
          @blurred_image[i][j-1] = 1 if @blurred_image[i][j-1] 
          @blurred_image[i][j+1] = 1 if @blurred_image[i][j+1] 
          @blurred_image[i-1][j] = 1 if @blurred_image[i-1][j] 
          @blurred_image[i+1][j] = 1 if @blurred_image[i+1][j] 
        end
      end       
    end
    if distance > 1
      @picture = @blurred_image #save progress of image blur in @picture so we can continue in recursive call 
      blur(distance-1) #iterate as long as distance > 1
      elsif distance == 1 #necessary so blurred image isn't printed 'distance' times
      @blurred_image.each_index do |i|
        puts @blurred_image[i].join
      end
    end
  end
end

pic = Image.new(
  [0,0,0,0,0,0,0,0,0],
  [1,0,0,0,0,0,0,0,0],
  [0,0,0,0,0,0,0,0,0],
  [0,0,0,0,1,0,0,0,0],
  [0,0,0,0,0,0,0,0,0],
  [0,0,0,0,0,0,0,0,0],
  [0,0,0,0,0,0,0,0,0],
  [0,0,0,0,0,0,0,0,0],
  [0,0,0,0,0,0,0,0,0]
)
pic.blur(3)
Run Code Online (Sandbox Code Playgroud)

我的函数可以正常工作,但前提是1不超出数组的范围.如果我在角落放一个1,看起来我的函数试图编辑一个不存在的索引的值,我得到以下消息:

image_blur.rb:28:in `block (2 levels) in blur': undefined method `[]' for nil:NilClass (NoMethodError)
from image_blur.rb:22:in `each_index'
from image_blur.rb:22:in `block in blur'
from image_blur.rb:21:in `each_index'
from image_blur.rb:21:in `blur'
from image_blur.rb:35:in `blur'
from image_blur.rb:35:in `blur'
from image_blur.rb:47:in `<main>'
Run Code Online (Sandbox Code Playgroud)

我试图告诉它只在索引存在的情况下将1分配给索引.我很感激任何帮助.

Tar*_*ast 2

看起来您正在尝试先检查两层深度,然后再检查一层深度。

例如,它可能picture[1]不存在......所以如果您尝试检查picture[i][j]它会失败。

您可以尝试在索引之前检查每个级别是否存在......

if @picture[i] && @picture[i][j] && @picture[i][j] == 1
   if @blurred_image[i].present?
      @blurred_image[i][j]   = 1 if @blurred_image[i][j] 
      @blurred_image[i][j-1] = 1 if @blurred_image[i][j-1] 
      @blurred_image[i][j+1] = 1 if @blurred_image[i][j+1]
   end
   @blurred_image[i-1][j] = 1 if @blurred_image[i-1] && @blurred_image[i-1][j] 
   @blurred_image[i+1][j] = 1 if @blurred_image[i+1] && @blurred_image[i+1][j] 
Run Code Online (Sandbox Code Playgroud)