ノート:X11の色名称
色のバリエーションについて
[編集]主ページに「このうち "color1" が元の "color" に対応する。例えば、"snow1" は "snow" と同じである。」とありますが、全ての「元の色」がcolor1に対応するのではないようです。手元にあるmacOSのXQuartz 2.8.1とMicroImages社のTNTgis 2021で確認したところ、31の色でcolor1に対応しますが、SeaGreenはSeaGreen4と同じです。また、5色では丸め誤差の関係か、次のように少しだけ数値が異なっています(ユークリッド距離が4未満)。
DarkOrchid (153,50,204): DarkOrchid3 (154,50,205)
LightGoldenrod (238,221,130): LightGoldenrod2 (238,220,130)
OliveDrab (107,142,35): OliveDrab4 (105,139,34)
PaleTurquoise (175,238,238): PaleTurquoise2 174,238,238
SlateBlue (106,90,205): SlateBlue3 (105,89,205)
残りの41色はcolor1〜4のどれにも相当しません。(うち11色はユークリッド距離が4以上12未満でどれかの色にやや似ています。)この場合、元の色はcolor4よりも暗い場合(DarkOliveGreen, color1の42%など)と1〜4の中間(AntiqueWhitebrown, 66%で3と4の間、burlywood, 87%で2と3の間)があります。また、LightPink, tan, turquoise, VioretRedのように元の色が1〜4をプロットした3次元直線上に乗らない、つまり全く別な色の場合もあります。
いずれの場合もcolor1とcolor2~4の関係は主ページに書かれている通り、color1を100としたとき、それぞれ 93, 80, 55%になっていました。
これらが全てのdistributionで共通するのかはわかりませんが、少し記述を変更してはどうかと考えます。
以上は次のRubyスクリプトで確認しました。
SamenessLimit = 16 SimilarityLimit = 144 one_to_four = {} base_color = {} colors = File.open("rgb.txt").readlines.collect{|line| line.chomp.scan(/\d+|[ A-Za-z]+\d*$/)} colors.each do |color| next if /^[Gg]r[ae]y\d*$/ =~ color[3] if /(\D+)([1-4])$/ =~ color[3] if one_to_four[$1] one_to_four[$1][$2.to_i] = color[0..2].collect{|a| a.to_i} else one_to_four[$1] = {$2.to_i => color[0..2].collect{|a| a.to_i}} end end end colors.each do |color| base_color[color[3]] = color[0..2].collect{|a| a.to_i} if one_to_four[color[3]] end one_to_four.each do |name, rgb| (0..2).each do |i| base_value = one_to_four[name][1][i] if base_value == 0 base_color[name] << 0 else base_color[name] << (base_color[name][i].to_f/base_value*100).round end (1..4).each do |j| if base_value == 0 one_to_four[name][j] << 0 else one_to_four[name][j] << (rgb[j][i].to_f/base_value*100).round end end end end counts = {identical: [0,0,0,0], same: [0,0,0,0], similar: [0,0,0,0], none: 0} one_to_four.keys.sort_by{|a| a.downcase}.each do |color| distances = one_to_four[color].collect{|k,v| s=0; v[0..2].each_with_index{|a,i| s+=(a - base_color[color][i])**2}; [k, s]} closest = distances.select{|a| a[1] < SamenessLimit}.first similar = distances.select{|a| a[1].between?(SamenessLimit, SimilarityLimit)}.first if closest if closest[1]==0 counts[:identical][closest[0]-1] += 1 closest_name = ", identical to #{color}#{closest[0]}" else counts[:same][closest[0]-1] += 1 closest_name = ", same as #{color}#{closest[0]} (#{sprintf("%.1f", Math::sqrt(closest[1]))})" end end if similar counts[:similar][similar[0]-1] += 1 similar_name = ", similar to #{color}#{similar[0]} (#{sprintf("%.1f", Math::sqrt(similar[1]))})" else similar_name = "" counts[:none] += 1 unless closest end puts "#{color} #{base_color[color][0..2].join(",")} (#{base_color[color][3..5].join(",")})#{closest_name}#{similar_name}" (1..4).each do |i| puts "#{color}#{i} #{one_to_four[color][i][0..2].join(",")} (#{one_to_four[color][i][3..5].join(",")})" end end puts "Colors with identical: #{counts[:identical].join(',')}, same: #{counts[:same].join(',')}, similar: #{counts[:similar].join(',')}, not 1-4: #{counts[:none]}"