rgbcell 0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +119 -0
  3. data/lib/rgbcell.rb +574 -0
  4. metadata +46 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: bb2bf06b2bb1f5162249b2a5e02d1ec58ad4b35a7c4f172c30a3302f6ec36f99
4
+ data.tar.gz: e3df58f700117a89c5e2183ec36f90859986f0567888923948439a49d1f65096
5
+ SHA512:
6
+ metadata.gz: 5182f8c620e5bd05652efbc95c4cc75167a323b316e154c50fe4162a81758873e1157b92640a51cc8fd2cd978bf83744fd81c4f759b8337b2be28b869aacf82b
7
+ data.tar.gz: d9aac83ce02fa07b1c92104cd8ee21e7fcd4c10c8bbd7da24a9fde624aa4e1b9016d0a2970d485148d72af9e2dbff20c8c8317631ed9cdbb12dcde24223c2721
@@ -0,0 +1,119 @@
1
+ # RGBCell
2
+
3
+ RGBCell represents a color as the coordinates in the x-y-z coordinate system.
4
+ Each of the three component color elements, red, green, and blue, have a float
5
+ value from 0 to 256.
6
+
7
+ Creating an object without any params creates black:
8
+
9
+ 1. require 'rgbcell'
10
+ 2. color = RGBCell.new
11
+ 3. color.to_s #=> #000000
12
+ 4. color.red #=> 0.0
13
+ 5. color.green #=> 0.0
14
+ 6. color.blue #=> 0.0
15
+
16
+ Line 1 loads the RGBCell module.
17
+ Line 2 create an RGBCell object. Because there are no parameters
18
+ given, the object represents black. Line 3 show the
19
+ stringification of the color such as might be used in CSS. Lines
20
+ 4-6 show the numeric values of the three component
21
+ colors, which are stored as floats.
22
+
23
+ There are several ways to indicate the color in RGBCell::new. One way is to give
24
+ its three components as numeric values.
25
+
26
+ color = RGBCell.new(127, 255, 0)
27
+ color.to_s #=> #7fff00
28
+
29
+ You can indicate the color using hex format:
30
+
31
+ color = RGBCell.new('#7fff00')
32
+ color.to_s #=> #7fff00
33
+ color.red #=> 127.0
34
+ color.green #=> 255.0
35
+ color.blue #=> 0.0
36
+
37
+ You can give one of the HTML named colors:
38
+
39
+ color = RGBCell.new('purple')
40
+ color.to_s #=> #800080
41
+ color.red #=> 128.0
42
+ color.green #=> 0.0
43
+ color.blue #=> 128.0
44
+
45
+ Finally, you can use 'random' to get a random color:
46
+
47
+ color = RGBCell.new('random')
48
+ color.to_s #=> #dbd25b
49
+ color.red #=> 219.0
50
+ color.green #=> 210.0
51
+ color.blue #=> 91.0
52
+
53
+ You can also set each component color individually. Notice in this example that
54
+ a component integer value is converted to float.
55
+
56
+ color = RGBCell.new()
57
+ color.red = 60 #=> 60.0
58
+ color.green = 230 #=> 210.0
59
+ color.blue = 91.005 #=> 91.0005
60
+ color.to_s #=> #3ce65b
61
+
62
+ ## Distance
63
+
64
+ Because every color is a set of coordinates, the difference between two colors
65
+ can be expressed as a distance. The distance is always zero or a positive
66
+ number. For example, the following example gives the distance between red and
67
+ chartreuse.
68
+
69
+ red = RGBCell.new('red')
70
+ chartreuse = RGBCell.new('chartreuse')
71
+ red.distance(chartreuse) #=> 285.3226244096321
72
+
73
+ The same thing can be expressed with the minus operator.
74
+
75
+ puts red - chartreuse #=> 285.3226244096321
76
+
77
+ The second color does not have to be an RGBCell object; it only needs to be an
78
+ expression that can be used to create an RGBCell object.
79
+
80
+ puts red - 'green' #=> 360.62445840513925
81
+
82
+ ## Average
83
+
84
+ Two or more colors can be averaged by calculating the midpoint of their
85
+ coordinates using the `average` method. The result of the average is itself an
86
+ RGBCell object.
87
+
88
+ red = RGBCell.new('red')
89
+ tomato = RGBCell.new('tomato')
90
+ avg = red.average(tomato)
91
+ puts avg.class #=> RGBCell
92
+ puts avg.to_s #=> #ff3100
93
+
94
+ You can pass in more than one color for averaging. You can use RGBCell objects
95
+ or any object that can be used to create an RGBCell object.
96
+
97
+ tomato = RGBCell.new('tomato')
98
+ puts tomato.average('orange', 'olive') #=> #d48200
99
+
100
+ If you prefer not to create any colors at all, you can use the class method.
101
+
102
+ puts RGBCell.average('tomato', 'orange', 'olive') #=> #d48200
103
+
104
+ ## Install
105
+
106
+ ```
107
+ gem install rgbcube
108
+ ```
109
+
110
+ ## Author
111
+
112
+ Mike O'Sullivan
113
+ mike@idocs.com
114
+
115
+ ## History
116
+
117
+ | version | date | notes |
118
+ |---------|---------------|-------------------------------------------------------|
119
+ | 0.5 | June 25, 2020 | Initial upload. |
@@ -0,0 +1,574 @@
1
+ #===============================================================================
2
+ # RGBCell
3
+ #
4
+
5
+ # An RGBCell object represents a single color in the red-green-blue color
6
+ # scheme, such as is used in HTML or CSS.
7
+
8
+ class RGBCell
9
+ # version
10
+ VERSION = '0.5'
11
+
12
+ #---------------------------------------------------------------------------
13
+ # initialize
14
+ #
15
+
16
+ # Initializes a new RGBCell object. The params can be in one of several
17
+ # forms.
18
+ #
19
+ # - three numbers
20
+ # RGBCell.new(127, 255, 0)
21
+ #
22
+ # - a named color
23
+ # RGBCell.new('orange')
24
+ #
25
+ # - a hexidecimal expression
26
+ # RGBCell.new('#7fff00')
27
+ #
28
+ # - a random color
29
+ # RGBCell.new('random')
30
+ #
31
+ # - no param returns black
32
+ # RGBCell.new
33
+
34
+ def initialize(*opts)
35
+ # $tm.hrm
36
+
37
+ # no opts: set to black
38
+ if opts.length == 0
39
+ @red = 0.0
40
+ @green = 0.0
41
+ @blue = 0.0
42
+
43
+ # 1 opt
44
+ elsif opts.length == 1
45
+ # array
46
+ if opts[0].is_a?(Array)
47
+ @red = opts[0][0].to_f
48
+ @green = opts[0][1].to_f
49
+ @blue = opts[0][2].to_f
50
+
51
+ # random
52
+ elsif opts[0] == 'random'
53
+ randomize()
54
+
55
+ # named
56
+ elsif coords = NAMES[opts[0]]
57
+ @red = coords[0].to_f
58
+ @green = coords[1].to_f
59
+ @blue = coords[2].to_f
60
+
61
+ # hex
62
+ elsif opts[0].match(/\A\#?[a-f0-9]{6,}\z/mu)
63
+ rgbs = opts[0]
64
+ rgbs = rgbs.sub(/\A\#/mu, '')
65
+ @red = rgbs[0..1].hex
66
+ @green = rgbs[2..3].hex
67
+ @blue = rgbs[4..5].hex
68
+
69
+ # else unknown opt
70
+ else
71
+ raise 'unknown-opt: ' + opts[0].to_s
72
+ end
73
+
74
+ # 3 opts
75
+ elsif opts.length == 3
76
+ @red = opts[0].to_f
77
+ @green = opts[1].to_f
78
+ @blue = opts[2].to_f
79
+
80
+ # any other number of options is invalid
81
+ else
82
+ raise 'invalid-initialize-options-length: ' + opts.length.to_s
83
+ end
84
+ end
85
+ #
86
+ # initialize
87
+ #---------------------------------------------------------------------------
88
+
89
+
90
+ #---------------------------------------------------------------------------
91
+ # readers
92
+ #
93
+
94
+ # The value of the red component.
95
+ attr_reader :red
96
+
97
+ # The value of the green component.
98
+ attr_reader :green
99
+
100
+ # The value of the blue component.
101
+ attr_reader :blue
102
+
103
+ #
104
+ # readers
105
+ #---------------------------------------------------------------------------
106
+
107
+
108
+
109
+ #---------------------------------------------------------------------------
110
+ # obj_or_new
111
+ #
112
+
113
+ # If the given object is an EGBCell object, then it is returned. Otherwise
114
+ # the object is used to create an RGBCell object.
115
+ def self.obj_or_new(*positions)
116
+ if positions[0].is_a?(RGBCell)
117
+ return positions[0]
118
+ else
119
+ return self.new(*positions)
120
+ end
121
+ end
122
+
123
+ #
124
+ # obj_or_new
125
+ #---------------------------------------------------------------------------
126
+
127
+
128
+ #---------------------------------------------------------------------------
129
+ # red=, green=, blue=
130
+ #
131
+
132
+ # Sets the red coordinate. Converts the given number to a float.
133
+ def red=(coord)
134
+ @red = coord.to_f
135
+ end
136
+
137
+ # Sets the greens coordinate. Converts the given number to a float.
138
+ def green=(coord)
139
+ @green = coord.to_f
140
+ end
141
+
142
+ # Sets the blue coordinate. Converts the given number to a float.
143
+ def blue=(coord)
144
+ @blue = coord.to_f
145
+ end
146
+
147
+ #
148
+ # red=, green=, blue=
149
+ #---------------------------------------------------------------------------
150
+
151
+
152
+ #---------------------------------------------------------------------------
153
+ # positions
154
+ #
155
+
156
+ # Returns an array of the three component coordinates.
157
+ def positions()
158
+ return [@red, @green, @blue]
159
+ end
160
+ #
161
+ # positions
162
+ #---------------------------------------------------------------------------
163
+
164
+
165
+ #---------------------------------------------------------------------------
166
+ # randomize
167
+ #
168
+
169
+ # Sets the object to a random color.
170
+ def randomize
171
+ @red = self.class.rand_255().to_f
172
+ @green = self.class.rand_255().to_f
173
+ @blue = self.class.rand_255().to_f
174
+ end
175
+
176
+ #
177
+ # randomize
178
+ #---------------------------------------------------------------------------
179
+
180
+
181
+ #---------------------------------------------------------------------------
182
+ # average
183
+ #
184
+
185
+ # Returns a color representing the midpoint between the object's color and
186
+ # the other given colors.
187
+ def average(*others)
188
+ # $tm.hrm
189
+ r_sum = @red
190
+ g_sum = @green
191
+ b_sum = @blue
192
+
193
+ # loop through others
194
+ others.each do |other|
195
+ other = self.class.obj_or_new(other)
196
+ r_sum += other.red
197
+ g_sum += other.green
198
+ b_sum += other.blue
199
+ end
200
+
201
+ # total
202
+ total = others.length + 1
203
+
204
+ # return
205
+ return self.class.new( r_sum/total, g_sum/total, b_sum/total )
206
+ end
207
+
208
+ #
209
+ # average
210
+ #---------------------------------------------------------------------------
211
+
212
+
213
+ #---------------------------------------------------------------------------
214
+ # self.average
215
+ #
216
+
217
+ # Returns the midpoint of the given colors expressed as a color.
218
+ def self.average(*colors)
219
+ base = self.obj_or_new(colors.shift)
220
+ return base.average(*colors)
221
+ end
222
+
223
+ #
224
+ # self.average
225
+ #---------------------------------------------------------------------------
226
+
227
+
228
+ #---------------------------------------------------------------------------
229
+ # to_s, to_str, +
230
+ #
231
+
232
+ # Returns the hexidecimal representation of the color.
233
+ def to_s
234
+ return to_str()
235
+ end
236
+
237
+ # Returns the hexidecimal representation of the color.
238
+ def to_str
239
+ rv = '#'
240
+
241
+ # loop through coordinates
242
+ positions.each do |pos|
243
+ rv += self.class.coord_to_hex(pos)
244
+ end
245
+
246
+ # return
247
+ return rv
248
+ end
249
+
250
+ # I don't remember what the point of this method was supposed to be.
251
+ # def +(val)
252
+ # return to_str() + val.to_str
253
+ # end
254
+
255
+ #
256
+ # to_s, to_str, +
257
+ #---------------------------------------------------------------------------
258
+
259
+
260
+ #---------------------------------------------------------------------------
261
+ # coord_to_hex
262
+ #
263
+
264
+ # Converts a color coordinate to hexidecimal.
265
+ def self.coord_to_hex(coord)
266
+ return coord.to_i.to_s(16).rjust(2, '0')
267
+ end
268
+ #
269
+ # coord_to_hex
270
+ #---------------------------------------------------------------------------
271
+
272
+
273
+ #---------------------------------------------------------------------------
274
+ # distance
275
+ #
276
+
277
+ # Returns the distance between the color and the given color. Always returns
278
+ # zero or a positive number.
279
+ def distance(*other)
280
+ # $tm.hrm
281
+
282
+ # ensure object
283
+ other = self.class.obj_or_new(*other)
284
+
285
+ # individual distances
286
+ red_d = (@red - other.red).abs2
287
+ green_d = (@green - other.green).abs2
288
+ blue_d = (@blue - other.blue).abs2
289
+
290
+ # rv
291
+ return Math.sqrt(red_d + green_d + blue_d).abs
292
+ end
293
+ #
294
+ # distance
295
+ #---------------------------------------------------------------------------
296
+
297
+
298
+ #---------------------------------------------------------------------------
299
+ # -
300
+ #
301
+
302
+ # Alias for RGBCell#distance.
303
+ def -(*other)
304
+ return distance(*other)
305
+ end
306
+
307
+ #
308
+ # -
309
+ #---------------------------------------------------------------------------
310
+
311
+
312
+ #---------------------------------------------------------------------------
313
+ # named colors
314
+ # https://www.w3.org/wiki/CSS/Properties/color/keywords
315
+ #
316
+
317
+ # A hash of official named HTML colors. For the full list of names, see
318
+ # https://www.w3.org/wiki/CSS/Properties/color/keywords
319
+ NAMES = {}
320
+
321
+ NAMES['aliceblue'] = [240, 248, 255]
322
+ NAMES['antiquewhite'] = [250, 235, 215]
323
+ NAMES['aqua'] = [0, 255, 255]
324
+ NAMES['aquamarine'] = [127, 255, 212]
325
+ NAMES['azure'] = [240, 255, 255]
326
+ NAMES['beige'] = [245, 245, 220]
327
+ NAMES['bisque'] = [255, 228, 196]
328
+ NAMES['black'] = [0, 0, 0]
329
+ NAMES['blanchedalmond'] = [255, 235, 205]
330
+ NAMES['blue'] = [0, 0, 255]
331
+ NAMES['blueviolet'] = [138, 43, 226]
332
+ NAMES['brown'] = [165, 42, 42]
333
+ NAMES['burlywood'] = [222, 184, 135]
334
+ NAMES['cadetblue'] = [95, 158, 160]
335
+ NAMES['chartreuse'] = [127, 255, 0]
336
+ NAMES['chocolate'] = [210, 105, 30]
337
+ NAMES['coral'] = [255, 127, 80]
338
+ NAMES['cornflowerblue'] = [100, 149, 237]
339
+ NAMES['cornsilk'] = [255, 248, 220]
340
+ NAMES['crimson'] = [220, 20, 60]
341
+ NAMES['cyan'] = [0, 255, 255]
342
+ NAMES['darkblue'] = [0, 0, 139]
343
+ NAMES['darkcyan'] = [0, 139, 139]
344
+ NAMES['darkgoldenrod'] = [184, 134, 11]
345
+ NAMES['darkgray'] = [169, 169, 169]
346
+ NAMES['darkgreen'] = [0, 100, 0]
347
+ NAMES['darkkhaki'] = [189, 183, 107]
348
+ NAMES['darkmagenta'] = [139, 0, 139]
349
+ NAMES['darkolivegreen'] = [85, 107, 47]
350
+ NAMES['darkorange'] = [255, 140, 0]
351
+ NAMES['darkorchid'] = [153, 50, 204]
352
+ NAMES['darkred'] = [139, 0, 0]
353
+ NAMES['darksalmon'] = [233, 150, 122]
354
+ NAMES['darkseagreen'] = [143, 188, 143]
355
+ NAMES['darkslateblue'] = [72, 61, 139]
356
+ NAMES['darkslategray'] = [47, 79, 79]
357
+ NAMES['darkturquoise'] = [0, 206, 209]
358
+ NAMES['darkviolet'] = [148, 0, 211]
359
+ NAMES['deeppink'] = [255, 20, 147]
360
+ NAMES['deepskyblue'] = [0, 191, 255]
361
+ NAMES['dimgray'] = [105, 105, 105]
362
+ NAMES['dodgerblue'] = [30, 144, 255]
363
+ NAMES['firebrick'] = [178, 34, 34]
364
+ NAMES['floralwhite'] = [255, 250, 240]
365
+ NAMES['forestgreen'] = [34, 139, 34]
366
+ NAMES['fuchsia'] = [255, 0, 255]
367
+ NAMES['gainsboro'] = [220, 220, 220]
368
+ NAMES['ghostwhite'] = [248, 248, 255]
369
+ NAMES['gold'] = [255, 215, 0]
370
+ NAMES['goldenrod'] = [218, 165, 32]
371
+ NAMES['gray'] = [128, 128, 128]
372
+ NAMES['green'] = [0, 128, 0]
373
+ NAMES['greenyellow'] = [173, 255, 47]
374
+ NAMES['honeydew'] = [240, 255, 240]
375
+ NAMES['hotpink'] = [255, 105, 180]
376
+ NAMES['indianred'] = [205, 92, 92]
377
+ NAMES['indigo'] = [75, 0, 130]
378
+ NAMES['ivory'] = [255, 255, 240]
379
+ NAMES['khaki'] = [240, 230, 140]
380
+ NAMES['lavender'] = [230, 230, 250]
381
+ NAMES['lavenderblush'] = [255, 240, 245]
382
+ NAMES['lawngreen'] = [124, 252, 0]
383
+ NAMES['lemonchiffon'] = [255, 250, 205]
384
+ NAMES['lightblue'] = [173, 216, 230]
385
+ NAMES['lightcoral'] = [240, 128, 128]
386
+ NAMES['lightcyan'] = [224, 255, 255]
387
+ NAMES['lightgoldenrodyellow'] = [250, 250, 210]
388
+ NAMES['lightgray'] = [211, 211, 211]
389
+ NAMES['lightgreen'] = [144, 238, 144]
390
+ NAMES['lightpink'] = [255, 182, 193]
391
+ NAMES['lightsalmon'] = [255, 160, 122]
392
+ NAMES['lightseagreen'] = [32, 178, 170]
393
+ NAMES['lightskyblue'] = [135, 206, 250]
394
+ NAMES['lightslategray'] = [119, 136, 153]
395
+ NAMES['lightsteelblue'] = [176, 196, 222]
396
+ NAMES['lightyellow'] = [255, 255, 224]
397
+ NAMES['lime'] = [0, 255, 0]
398
+ NAMES['limegreen'] = [50, 205, 50]
399
+ NAMES['linen'] = [250, 240, 230]
400
+ NAMES['magenta'] = [255, 0, 255]
401
+ NAMES['maroon'] = [128, 0, 0]
402
+ NAMES['mediumaquamarine'] = [102, 205, 170]
403
+ NAMES['mediumblue'] = [0, 0, 205]
404
+ NAMES['mediumorchid'] = [186, 85, 211]
405
+ NAMES['mediumpurple'] = [147, 112, 219]
406
+ NAMES['mediumseagreen'] = [60, 179, 113]
407
+ NAMES['mediumslateblue'] = [123, 104, 238]
408
+ NAMES['mediumspringgreen'] = [0, 250, 154]
409
+ NAMES['mediumturquoise'] = [72, 209, 204]
410
+ NAMES['mediumvioletred'] = [199, 21, 133]
411
+ NAMES['midnightblue'] = [25, 25, 112]
412
+ NAMES['mintcream'] = [245, 255, 250]
413
+ NAMES['mistyrose'] = [255, 228, 225]
414
+ NAMES['moccasin'] = [255, 228, 181]
415
+ NAMES['navajowhite'] = [255, 222, 173]
416
+ NAMES['navy'] = [0, 0, 128]
417
+ NAMES['oldlace'] = [253, 245, 230]
418
+ NAMES['olive'] = [128, 128, 0]
419
+ NAMES['olivedrab'] = [107, 142, 35]
420
+ NAMES['orange'] = [255, 165, 0]
421
+ NAMES['orangered'] = [255, 69, 0]
422
+ NAMES['orchid'] = [218, 112, 214]
423
+ NAMES['palegoldenrod'] = [238, 232, 170]
424
+ NAMES['palegreen'] = [152, 251, 152]
425
+ NAMES['paleturquoise'] = [175, 238, 238]
426
+ NAMES['palevioletred'] = [219, 112, 147]
427
+ NAMES['papayawhip'] = [255, 239, 213]
428
+ NAMES['peachpuff'] = [255, 218, 185]
429
+ NAMES['peru'] = [205, 133, 63]
430
+ NAMES['pink'] = [255, 192, 203]
431
+ NAMES['plum'] = [221, 160, 221]
432
+ NAMES['powderblue'] = [176, 224, 230]
433
+ NAMES['purple'] = [128, 0, 128]
434
+ NAMES['red'] = [255, 0, 0]
435
+ NAMES['rosybrown'] = [188, 143, 143]
436
+ NAMES['royalblue'] = [65, 105, 225]
437
+ NAMES['saddlebrown'] = [139, 69, 19]
438
+ NAMES['salmon'] = [250, 128, 114]
439
+ NAMES['sandybrown'] = [244, 164, 96]
440
+ NAMES['seagreen'] = [46, 139, 87]
441
+ NAMES['seashell'] = [255, 245, 238]
442
+ NAMES['sienna'] = [160, 82, 45]
443
+ NAMES['silver'] = [192, 192, 192]
444
+ NAMES['skyblue'] = [135, 206, 235]
445
+ NAMES['slateblue'] = [106, 90, 205]
446
+ NAMES['slategray'] = [112, 128, 144]
447
+ NAMES['snow'] = [255, 250, 250]
448
+ NAMES['springgreen'] = [0, 255, 127]
449
+ NAMES['steelblue'] = [70, 130, 180]
450
+ NAMES['tan'] = [210, 180, 140]
451
+ NAMES['teal'] = [0, 128, 128]
452
+ NAMES['thistle'] = [216, 191, 216]
453
+ NAMES['tomato'] = [255, 99, 71]
454
+ NAMES['turquoise'] = [64, 224, 208]
455
+ NAMES['violet'] = [238, 130, 238]
456
+ NAMES['wheat'] = [245, 222, 179]
457
+ NAMES['white'] = [255, 255, 255]
458
+ NAMES['whitesmoke'] = [245, 245, 245]
459
+ NAMES['yellow'] = [255, 255, 0]
460
+ NAMES['yellowgreen'] = [154, 205, 50]
461
+
462
+ #
463
+ # named colors
464
+ #---------------------------------------------------------------------------
465
+
466
+
467
+ #---------------------------------------------------------------------------
468
+ # method_missing
469
+ #
470
+
471
+ # This method allows you to create colors by name as if the color names were
472
+ # methods. For example, RGBCell.red returns an object representing the color
473
+ # red.
474
+ def self.method_missing(key)
475
+ # $tm.hrm
476
+ # puts key.class
477
+ # puts NAMES[key.to_s]
478
+ # $tm.devexit
479
+
480
+ if name = NAMES[key.to_s]
481
+ return self.new(name)
482
+ else
483
+ super(key)
484
+ end
485
+ end
486
+
487
+ #
488
+ # method_missing
489
+ #---------------------------------------------------------------------------
490
+
491
+
492
+ #---------------------------------------------------------------------------
493
+ # froms
494
+ #
495
+
496
+ # Returns the distance from the color black.
497
+ def from_black
498
+ return distance(self.class.black)
499
+ end
500
+
501
+ # Returns the distance from the color white.
502
+ def from_white
503
+ return distance(self.class.white)
504
+ end
505
+
506
+ #
507
+ # froms
508
+ #---------------------------------------------------------------------------
509
+
510
+
511
+ #---------------------------------------------------------------------------
512
+ # comparison operators
513
+ #
514
+ # def >(other)
515
+ # return (from_white() > other.from_white)
516
+ # end
517
+ #
518
+ # def ==(other)
519
+ # return (from_white.to_s == other.from_white)
520
+ # end
521
+ #
522
+ # def <(other)
523
+ # return (from_white() < other.from_white)
524
+ # end
525
+ #
526
+ # def <=>(other)
527
+ # return (from_white() <=> other.from_white())
528
+ # end
529
+ #
530
+ # comparison operators
531
+ #---------------------------------------------------------------------------
532
+
533
+
534
+ #---------------------------------------------------------------------------
535
+ # pivot
536
+ #
537
+
538
+ # Returns a new RGBCell object in which the component colors have been
539
+ # pivoted. Red becomes blue, green becomes red, blue becomes green.
540
+ def pivot
541
+ return self.class.new(@green, @blue, @red)
542
+ end
543
+
544
+ # Pivots the objects colors in place.
545
+ def pivot!
546
+ rgb = [@green, @blue, @red]
547
+ @red = rgb[0]
548
+ @green = rgb[1]
549
+ @blue = rgb[2]
550
+ return self
551
+ end
552
+
553
+ #
554
+ # pivot
555
+ #---------------------------------------------------------------------------
556
+
557
+
558
+ # private
559
+ private
560
+
561
+
562
+ #---------------------------------------------------------------------------
563
+ # rand_255
564
+ #
565
+ def self.rand_255
566
+ return rand(0..255).to_f
567
+ end
568
+ #
569
+ # rand_255
570
+ #---------------------------------------------------------------------------
571
+ end
572
+ #
573
+ # RGBCell
574
+ #===============================================================================
metadata ADDED
@@ -0,0 +1,46 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rgbcell
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.5'
5
+ platform: ruby
6
+ authors:
7
+ - Mike O'Sullivan
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-06-25 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Calculates colors based on their x-y-z coordinates. Used for cellular
14
+ automata.
15
+ email: mike@idocs.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - README.md
21
+ - lib/rgbcell.rb
22
+ homepage: https://rubygems.org/gems/rgbcell
23
+ licenses:
24
+ - MIT
25
+ metadata: {}
26
+ post_install_message:
27
+ rdoc_options: []
28
+ require_paths:
29
+ - lib
30
+ required_ruby_version: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ required_rubygems_version: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ requirements: []
41
+ rubyforge_project:
42
+ rubygems_version: 2.7.6
43
+ signing_key:
44
+ specification_version: 4
45
+ summary: Color calculations using Cartesian coordinat geometery
46
+ test_files: []