class Gauguin::ColorsClusterer

Public Instance Methods

call(colors) click to toggle source
# File lib/gauguin/colors_clusterer.rb, line 3
def call(colors)
  clusters = {}

  while !colors.empty?
    pivot = colors.shift
    group = [pivot]

    colors, pivot, group = find_all_similar(colors, pivot, group)

    clusters[pivot] = group
  end

  update_pivots_percentages(clusters)

  clusters
end
clusters(colors) click to toggle source
# File lib/gauguin/colors_clusterer.rb, line 20
def clusters(colors)
  clusters = self.call(colors)
  clusters = clusters.sort_by { |color, _| color.percentage }.reverse
  Hash[clusters[0...Gauguin.configuration.max_colors_count]]
end
reversed_clusters(clusters) click to toggle source
# File lib/gauguin/colors_clusterer.rb, line 26
def reversed_clusters(clusters)
  reversed_clusters = {}

  clusters.each do |pivot, group|
    group.each do |color|
      reversed_clusters[color] = pivot
    end
  end

  reversed_clusters
end

Private Instance Methods

find_all_similar(colors, pivot, group) click to toggle source
# File lib/gauguin/colors_clusterer.rb, line 40
def find_all_similar(colors, pivot, group)
  loop do
    similar_colors = colors.select { |c| c.similar?(pivot) }
    break if similar_colors.empty?

    group += similar_colors
    colors -= similar_colors

    pivot = group.sort_by(&:percentage).last
  end

  [colors, pivot, group]
end
update_pivots_percentages(clusters) click to toggle source
# File lib/gauguin/colors_clusterer.rb, line 54
def update_pivots_percentages(clusters)
  clusters.each do |main_color, group|
    percentage = group.inject(0) do |sum, color|
      sum += color.percentage
    end
    main_color.percentage = percentage
  end
end