10

N 行のグラフをグラフィカルに表示しようとしていますが、行の数に基づいて異なる色を動的に割り当てる方法を見つけようとしています。RGB の値は 0 から 1 の範囲です。白は背景が白なので使用できません。N < 7の場合は簡単だと思いました:

r=(h&0x4)/4;
g=(h&0x2)/2;
b=h&0x1;

これにより、黒、青、緑、シアン、赤、マゼンタ、黄色が得られます。しかし、その後は白を使用してからループします。インデックスに RGB 値を割り当てる良い方法を知っている人はいますか? 操作する不透明度の値もあります。

4

3 に答える 3

5

これを行うための私の好みの方法はn、カラー ホイールに沿って等間隔のポイントを見つけることです。

カラー ホイールを 0 ~ 360 の範囲の値として360 / n * 0表し360 / n * 1ます360 / n * (n - 1)。これを行うことで、各色の色相を定義しました。彩度を 1 に設定し、明度を 1 に設定することにより、これらの各色を色相彩度値 (HSV) 色として表すことができます。

(彩度が高いほど「豊かな」色、彩度が低いほどグレーに近い色、明度が高いほど「明るい」、明度が低いほど「暗い」という意味です。)

簡単な計算で、これらの各色の RGB 値が得られます。

http://en.wikipedia.org/wiki/HSL_and_HSV#Conversion_from_HSV_to_RGB

与えられた方程式は簡略化できることに注意してください。

  • p = v * (1 - s) = 1 * (1 - 1) = 1 * 0 = 0
  • q = v * (1 - f * s) = 1 * (1 - f * 1) = 1 - f
  • t = v * (1 - (1 - f) * s) = 1 * (1 - (1 - f) * 1) = 1 - (1 - f) = 1 - 1 + f = f

Python での疑似コードっぽい実装

注: これは意図的にひどく非効率的な実装です。この例を Python で示しているのは、基本的に、実行可能な疑似コードを提供できるようにするためです。

import math

def uniquecolors(n):
    """Compute a list of distinct colors, each of which is represented as an RGB 3-tuple."""
    hues = []
    # i is in the range 0, 1, ..., n - 1
    for i in range(n):
        hues.append(360.0 / i)

    hs = []
    for hue in hues:
        h = math.floor(hue / 60) % 6
        hs.append(h)

    fs = []
    for hue in hues:
        f = hue / 60 - math.floor(hue / 60)
        fs.append(f)

    rgbcolors = []
    for h, f in zip(hs, fs):
        v = 1
        p = 0
        q = 1 - f
        t = f
        if h == 0:
            color = v, t, p
        elif h == 1:
            color = q, v, p
        elif h == 2:
            color = p, v, t
        elif h == 3:
            color = p, q, v
        elif h == 4:
            color = t, p, v
        elif h == 5:
            color = v, p, q
        rgbcolors.append(color)

    return rgbcolors

Python での簡潔な実装

import math

v = 1.0
s = 1.0
p = 0.0
def rgbcolor(h, f):
    """Convert a color specified by h-value and f-value to an RGB
    three-tuple."""
    # q = 1 - f
    # t = f
    if h == 0:
        return v, f, p
    elif h == 1:
        return 1 - f, v, p
    elif h == 2:
        return p, v, f
    elif h == 3:
        return p, 1 - f, v
    elif h == 4:
        return f, p, v
    elif h == 5:
        return v, p, 1 - f

def uniquecolors(n):
    """Compute a list of distinct colors, ecah of which is
    represented as an RGB three-tuple"""
    hues = (360.0 / n * i for i in range(n))
    hs = (math.floor(hue / 60) % 6 for hue in hues)
    fs = (hue / 60 - math.floor(hue / 60) for hue in hues)
    return [rgbcolor(h, f) for h, f in zip(hs, fs)]
于 2010-01-26T20:00:11.517 に答える
0

私はあなたが説明する問題を正確に解決するためにこのコードを一度書きました(背景も白でした)。それはあなたと同じ考えですが、一般化されているだけです。OCamlからあなたの言語に簡単に適応できるはずです。

使用法

必要な色数を関数に指示する必要はありません。1、2、...で関数を呼び出して、色番号1、番号2、...を取得します。小さい番号の色は広く離れており、後者の色はもちろん互いに近づきます。

コード

lslは「論理左シフト」、lsr「論理右シフト」であり、!単に「参照にアクセスする」ことを意味します。OCamlでは、RGBカラーは単一の整数で表され、カラーごとに1バイトです。

number_to_color n =
  color = ref 0in
  番号=refninで
  i=0から7の場合
    color:=(!color lsl 1)+
      (!number land 1 <> 0 then 1 else 0の場合)+
      (!number land 2 <> 0の場合は256、それ以外の場合は0)+
      (!number land 4 <> 0の場合は65536、それ以外の場合は0);
    number:=!number lsr 3
  終わり;
  !色
于 2010-01-26T19:45:42.507 に答える
0
for r from 0 to 255 step (255*3/N):
  for g from 0 to 255 step (255*3/N):
    for b from 0 to 255 step (255*3/N):
      ...
于 2010-01-26T19:46:20.510 に答える