ノート:X11の色名称

message: 主ページに「このうち "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をプロットした３次元直線上に乗らない、つまり全く別な色の場合もあります。
いずれの場合も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
<nowiki>      one_to_four[$1] = {$2.to_i => color[0..2].collect{|a| a.to_i}}</nowiki>
    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]}"
Hkokubun（会話） 2022年6月29日 (水) 04:17 (UTC)
thread_title:  色のバリエーションについて