note vr <p>Colour value is a point in 3d space, how would you "order" these points along (which?) single axis? That said, the "ordering" can be considered as TSP, where simple greedy <a href="https://en.wikipedia.org/wiki/Nearest_neighbour_algorithm">nearest neighbour algorithm</a> and arbitrarily/heuristically chosen starting point (black) produce "good enough" result. (The fact that black is among source colours (moreover, first) is irrelevant -- root isn't included in solution)</p> <p></p> <p><a href="https://i.ibb.co/FHF5KmV/montage.png">Here</a> are 5 colour ramps: </p> <ul> <li>Original (unordered)</li> <li>Sorted just by hue, according to [choroba]. Not for any absurd competition, but for illustration only, since there's png generating code below, anyway. Black appearing second after red is puzzling, though</li> <li>NN result, where metric is euclidean distance in HSV space. See code. See [metamod://Convert::Color]</li> <li>NN result, where metric is euclidean distance in HSL space (<c>s/hsv/hsl/g</c> in code below)</li> <li>Throw some hard science at the problem. <a href="https://en.wikipedia.org/wiki/HSL_and_HSV">HSV/HSL</a> are not perceptually uniform. Assuming RGB is <a href="https://en.wikipedia.org/wiki/SRGB">sRGB</a>, map colours to <a href="https://en.wikipedia.org/wiki/CIELAB_color_space">Lab</a> colour space (a). At the time of its introduction, this space was designed to be perceptually uniform, but practice revealed it isn't. Therefore, let metric be not euclidean distance in Lab (CIEdE), but adjusted <a href="https://en.wikipedia.org/wiki/Color_difference#CIEDE2000">CIEdE2000</a> (b). Conversion (a) and metric (b) are not too difficult to implement in Perl by hand, but we have [metamod://PDL::Transform::Color] and [metamod://PDL::Graphics::ColorDistance], so why not use them. See addendum after <c>__END__</c>, add <c>use</c> statements and replace 1,2,3 fragments with their counterparts.</li> </ul> <p></p> <p>Well, how much scientific ramp is more "pleasing" is in the eye of beholder :). Maybe dumb NN is limiting factor here.</p> <c> use strict; use warnings; use feature 'say'; use Imager; use Convert::Color; use Convert::Color::RGB8; my @colors = map tr/#//dr, split "\n", <<'END_OF_COLORS'; #000000 #716373 #704A2B #AF7E45 #963049 #AA2261 #B24551 #E6212E #FF0000 #001200 #FFDE72 #F55B73 END_OF_COLORS my \$HEIGHT = 50; my \$TILE_W = 50; my \$WIDTH = \$TILE_W * @colors; my \$START = '000000'; my \$c = Convert::Color::RGB8-> new( \$START ) # -> convert_to( 'hsv' ); # 1 my @data = map [ \$_, Convert::Color::RGB8-> new( \$_ )-> convert_to( 'hsv' ), # 2 0 ], @colors; my @sorted; my \$len = 0; while ( @data ) { \$_-> [ 2 ] = \$_-> [ 1 ]-> dst_hsv( \$c ) # 3 for @data; @data = sort { \$a-> [ 2 ] <=> \$b-> [ 2 ] } @data; \$len += \$data[ 0 ][ 2 ]; ( my \$str, \$c ) = @{ shift @data }; push @sorted, \$str; } say \$len; my \$im = Imager-> new( xsize => \$WIDTH, ysize => \$HEIGHT, model => 'rgb' ); my \$x = 0; for ( @sorted ) { \$im-> box( filled => 1, xmin => \$x, color => \$_ ); \$x += \$TILE_W } \$im-> write( file => 'result.png' ); __END__ use PDL; use PDL::Transform::Color; use PDL::Graphics::ColorDistance; my \$c = t_lab-> apply((!t_srgb)-> apply( # pdl [ Convert::Color::RGB8-> new( \$START )-> rgb8 ])); # 1 t_lab-> apply((!t_srgb)-> apply( # pdl [ Convert::Color::RGB8-> new( \$_ )-> rgb8 ])), # 2 \$_-> [ 2 ] = delta_e_2000( \$_-> [ 1 ], \$c ) # 3 </c> <p><small><b>Edit: </b><c>s/Through/Throw/</c> :)</small></p> 11129152 11129152