Class: LIFX::Color

Inherits:
Struct
  • Object
show all
Extended by:
Colors
Defined in:
lib/lifx/color.rb

Overview

LIFX::Color represents a color intervally by HSBK (Hue, Saturation, Brightness/Value, Kelvin). It has methods to construct a LIFX::Color instance from various color representations.

Constant Summary collapse

UINT16_MAX =
65535
KELVIN_MIN =
2500
KELVIN_MAX =
9000
DEFAULT_SIMILAR_THRESHOLD =

0.1% variance

0.001

Constants included from Colors

LIFX::Colors::DEFAULT_KELVIN

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Colors

random_color, white

Constructor Details

#initialize(hue, saturation, brightness, kelvin) ⇒ Color


126
127
128
129
# File 'lib/lifx/color.rb', line 126

def initialize(hue, saturation, brightness, kelvin)
  hue = hue % 360
  super(hue, saturation, brightness, kelvin)
end

Instance Attribute Details

#brightnessObject

Returns the value of attribute brightness


36
37
38
# File 'lib/lifx/color.rb', line 36

def brightness
  @brightness
end

#hueObject

Returns the value of attribute hue


36
37
38
# File 'lib/lifx/color.rb', line 36

def hue
  @hue
end

#kelvinObject

Returns the value of attribute kelvin


36
37
38
# File 'lib/lifx/color.rb', line 36

def kelvin
  @kelvin
end

#saturationObject

Returns the value of attribute saturation


36
37
38
# File 'lib/lifx/color.rb', line 36

def saturation
  @saturation
end

Class Method Details

.hsb(hue, saturation, brightness) ⇒ Color Also known as: hsv

Helper method to create from HSB/HSV


48
49
50
# File 'lib/lifx/color.rb', line 48

def hsb(hue, saturation, brightness)
  new(hue, saturation, brightness, DEFAULT_KELVIN)
end

.hsbk(hue, saturation, brightness, kelvin) ⇒ Color

Helper method to create from HSBK/HSVK


59
60
61
# File 'lib/lifx/color.rb', line 59

def hsbk(hue, saturation, brightness, kelvin)
  new(hue, saturation, brightness, kelvin)
end

.hsl(hue, saturation, luminance) ⇒ Color

Helper method to create from HSL


68
69
70
71
72
73
74
75
# File 'lib/lifx/color.rb', line 68

def hsl(hue, saturation, luminance)
  # From: http://ariya.blogspot.com.au/2008/07/converting-between-hsl-and-hsv.html
  l = luminance * 2
  saturation *= (l <= 1) ? l : 2 - l
  brightness = (l + saturation) / 2
  saturation = (2 * saturation) / (l + saturation)
  new(hue, saturation, brightness, DEFAULT_KELVIN)
end

.rgb(r, g, b) ⇒ Color

Note:

RGB is not the recommended way to create colors

Helper method to create from RGB.


83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/lifx/color.rb', line 83

def rgb(r, g, b)
  r = r / 255.0
  g = g / 255.0
  b = b / 255.0

  max = [r, g, b].max
  min = [r, g, b].min

  h = s = v = max
  d = max - min
  s = max.zero? ? 0 : d / max

  if max == min
    h = 0
  else
    case max
    when r
      h = (g - b) / d + (g < b ? 6 : 0)
    when g
      h = (b - r) / d + 2
    when b
      h = (r - g) / d + 4
    end
    h = h * 60
  end

  new(h, s, v, DEFAULT_KELVIN)
end

Instance Method Details

#similar_to?(other, threshold: DEFAULT_SIMILAR_THRESHOLD) ⇒ Boolean

Checks if colours are equal to 0.1% variance


182
183
184
185
186
187
188
189
190
191
192
193
194
195
# File 'lib/lifx/color.rb', line 182

def similar_to?(other, threshold: DEFAULT_SIMILAR_THRESHOLD)
  return false unless other.is_a?(Color)
  conditions = []

  conditions << (((hue - other.hue).abs < (threshold * 360)) || begin
    # FIXME: Surely there's a better way.
    hues = [hue, other.hue].sort
    hues[0] += 360
    (hues[0] - hues[1]).abs < (threshold * 360)
  end)
  conditions << ((saturation - other.saturation).abs < threshold)
  conditions << ((brightness - other.brightness).abs < threshold)
  conditions.all?
end

#to_aArray<Float, Float, Float, Integer>

Returns hue, saturation, brightness and kelvin in an array


173
174
175
# File 'lib/lifx/color.rb', line 173

def to_a
  [hue, saturation, brightness, kelvin]
end

#with_brightness(brightness) ⇒ Color

Returns a new Color with the brightness changed while keeping other attributes


148
149
150
# File 'lib/lifx/color.rb', line 148

def with_brightness(brightness)
  Color.new(hue, saturation, brightness, kelvin)
end

#with_hue(hue) ⇒ Color

Returns a new Color with the hue changed while keeping other attributes


134
135
136
# File 'lib/lifx/color.rb', line 134

def with_hue(hue)
  Color.new(hue, saturation, brightness, kelvin)
end

#with_kelvin(kelvin) ⇒ Color

Returns a new Color with the kelvin changed while keeping other attributes


155
156
157
# File 'lib/lifx/color.rb', line 155

def with_kelvin(kelvin)
  Color.new(hue, saturation, brightness, kelvin)
end

#with_saturation(saturation) ⇒ Color

Returns a new Color with the saturaiton changed while keeping other attributes


141
142
143
# File 'lib/lifx/color.rb', line 141

def with_saturation(saturation)
  Color.new(hue, saturation, brightness, kelvin)
end