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:
-
#FFDE72 has more red than green or blue; however, there's so much green that it appears yellowish.
-
#001200 is pure green; however, there's so little green that I can't distinguish it from black.
-
#716373 has almost identical red, green and blue: it looks more like a grey to me.
"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.
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.