ノート: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]}"

Hkokubun会話2022年6月29日 (水) 04:17 (UTC)[返信]