Не удается определить слишком высокий уровень ошибки стека в грабли с рекурсивной функцией

У меня большая проблема с ошибкой "Уровень стека слишком глубокий" в моем сценарии рейка. Этот скрипт в основном считывает изображение, которое содержит несколько пикселей со значением "-1". Поэтому я использую рекурсивную функцию при обнаружении значения "-1" для анализа их соседей и сохранения их в массиве, если они тоже имеют значение "-1". У моего объекта найдены фигуры "-1".

Я сделал много тестов, и когда я комментирую функцию "label_recursively", ошибка не показывает ее. Но я не знаю, где грань с проблемой.

Я пробовал с разными версиями ruby, но у меня такие же результаты.

Загрузить изображение I'm using Chunky PNG gem, with Rails 4.0.0 and Ruby 2.1.2p95

Это мой код:

class ChunkyPNG::Image
  def neighbors(x,y)
    # up, right, down, left
    [[x, y-1], [x+1, y], [x, y+1], [x-1, y]].select do |xy|
      include_xy?(*xy)
    end
  end
end

def label_recursively(image, areas, label, x, y)
  image[x,y] = label
  (areas[label] ||= []) << [x,y]
  image.neighbors(x,y).each do |xy|
    if image[*xy] == -1
      areas[label] << xy
      label_recursively(image, areas, label, *xy)
    end
  end
end

working_image = ChunkyPNG::Image.from_file(file)

areas, label = {}, 0

working_image.height.times do |y|
  working_image.row(y).each_with_index do |pixel, x|
    label_recursively(working_image, areas, label += 1, x, y) if pixel == -1
  end
end

areas.each do
  area = areas.values.max { |result, area| result.length <=> area.length }
  areas.delete(areas.key(area))
  x, y = area.map { |xy| xy[0] }, area.map { |xy| xy[1] }
  image.rect(x.min, y.min, x.max, y.max, ChunkyPNG::Color.rgb(0,255,0))
end

заранее спасибо

0 ответов

Другие вопросы по тегам