in reply to Ordering Colours Problem
G'day merrymonk,
I saw this on Friday and couldn't think of a better answer than ++choroba's post. However, today (Sunday) I saw a spectrum presented as various shades of:
red -> yellow -> green -> cyan -> blue -> magenta -> greyscale(white - +> black)
If something along those lines suits your purpose, you can pull out, and possibly modify, parts of the following code, to get your desired result.
#!/usr/bin/env perl use strict; use warnings; use List::Util 'uniq'; my @input; { no warnings 'qw'; push @input, [qw{ #000000 #0000ff #ff0000 #ffffff #00ff00 #ffff00 #00ffff #ff00ff #000000 #00007f #7f0000 #7f7f7f #007f00 #7f7f00 #007f7f #7f007f }], [qw{ #000000 #716373 #704A2B #AF7E45 #963049 #AA2261 #B24551 #E6212E #FF0000 #001200 #FFDE72 #F55B73 }]; } for my $i (0 .. $#input) { my %data; $data{$_} = [ map hex, /(..)(..)(..)$/ ] for uniq @{$input[$i]}; my @ordered; for my $prime (qw{R G B}) { for my $type (qw{rgb ycm}) { push @ordered, sort_colours(\%data, $type, $prime); } } push @ordered, sort_colours(\%data, qw{grey R}); print_table(\@ordered); } sub sort_colours { my ($data, $type, $prime) = @_; my @result; my @hier = $prime eq 'R' ? (0,1,2) : $prime eq 'G' ? (1,2,0) : (2,0,1); push @result, sort { $data->{$b}[$hier[0]] <=> $data->{$a}[$hier[0]] || $data->{$b}[$hier[1]] <=> $data->{$a}[$hier[1]] || $data->{$b}[$hier[2]] <=> $data->{$a}[$hier[2]] } grep { if ($type eq 'rgb') { $data->{$_}[$hier[1]] < $data->{$_}[$hier[0]] && $data->{$_}[$hier[0]] > $data->{$_}[$hier[2]] } elsif ($type eq 'ycm') { $data->{$_}[$hier[0]] == $data->{$_}[$hier[1]] && $data->{$_}[$hier[0]] > $data->{$_}[$hier[2]] } else { $data->{$_}[$hier[0]] == $data->{$_}[$hier[1]] && $data->{$_}[$hier[0]] == $data->{$_}[$hier[2]] } } keys %$data; return @result; } sub print_table { my ($colours) = @_; print qq{<table border="1">\n}; for (@$colours) { print qq{ <tr><th><tt>$_</tt></th><td bgcolor="$_" width="100 +"> </td></tr>\n}; } print "</table>\n"; return; }
As you can see, I added a separate array of evenly-spaced colours (mainly for my own testing purposes). The output, from print_table(), is PM-style HTML which I pasted directly into my post.
With my test colours, I got the result I was looking for:
| #ff0000 | |
|---|---|
| #7f0000 | |
| #ffff00 | |
| #7f7f00 | |
| #00ff00 | |
| #007f00 | |
| #00ffff | |
| #007f7f | |
| #0000ff | |
| #00007f | |
| #ff00ff | |
| #7f007f | |
| #ffffff | |
| #7f7f7f | |
| #000000 |
Using the colours from your OP, the result is possibly not what you're after:
| #FFDE72 | |
|---|---|
| #FF0000 | |
| #F55B73 | |
| #E6212E | |
| #B24551 | |
| #AF7E45 | |
| #AA2261 | |
| #963049 | |
| #704A2B | |
| #001200 | |
| #716373 | |
| #000000 |
Some observations:
"how to order these so that they are in the same order as the colours found on a normal colour wheel"
If you told us what you believe the "normal colour wheel" order is, we would then at least know the expected results, and could potentially provide better answers.
This general problem-space is interesting. I've front-paged this question to perhaps gain a wider coverage. It would be particularly useful if you would provide feedback to the responses you've received.
— Ken
|
|---|