3

Pythonタートルパッケージを使用して、いくつかの固定点の周りに円を描くだけの簡単なプログラムに取り組んでいます。ただし、元のポイントから離れるにつれて色が「涼しくなる」ヒートマップのようにしたかったのです。私のアイデアは、ベースの白い色#FFFFFFを取り、距離に基づいてパーセンテージを差し引くことでした。

16進カラーコードは、色が「涼しくなる」につれて16進値が低くなることで機能すると想定しましたが、最初の2つは赤、2つ目は緑、最後は青を意味することを読みました。ヒートマップを希望どおりに実装するにはどうすればよいですか?

距離が正しいと確信しています。カラーコードを間違った方法で使用していると思います。色計算を行うために私が書いた関数:

def findColor(dist):
    base = "FFFFFF"
    num = int(base, 16)
    percent = dist/800 #800 is the max distance away
    newNum = (num - (num*percent))
    color = hex(int(newNum))
    return color

結果のマップは次のとおりです。

サークルヒートマップ

Ignacio Vazquez-AbramsのHSVに関する支援により、次のようになりました:):

更新されたカラーアルゴリズム

4

3 に答える 3

4

色にRGBの代わりにHSVを使用したい。距離に合わせて色相の寸法をスライドします。colorsys助けられる。

于 2011-12-18T07:29:45.850 に答える
1

秘訣は、3バイトを個別に処理することです。関数を機能するはずの方法で書き直す方法を紹介します。

def findColor(dist):
    base = 0xFFFFFF
    percent = dist/800 #800 is the max distance away
    hexpercent = 0xFF - (percent * 0xFF)
    first = (base & 0xFF0000) >> 16
    second = (base & 0xFF00) >> 8
    third = base & 0xFF
    color = hex(((first - hexpercent) << 16) | ((second - hexpercent) << 8) | (third - hexpercent))
    return color

各バイトを分離し、各バイトからパーセンテージを減算してから、バイトを整数に再構成します。これを行うにはもっと賢い方法があるかもしれませんが、それはあなたに灰色の安定したグラデーションを与えるはずです。(赤、緑、または青の安定したグラデーションが必要な場合は、0xFF0000またはで作業します。)0xFF000xFF

これは色の生理学的特性を考慮に入れていないことに注意してください-これにアプローチするためのより楽しい方法があるかもしれません。(実際の色の専門家は、関係する数のためにコンピューター科学者が喜ばせるために選択したWebセーフカラーに非常に腹を立てていました...)

于 2011-12-18T07:39:53.053 に答える
1

マルチカラーグラデーションを補間するコードは次のとおりです。白>赤>緑>青>黒になるように設定されていますが、他のグラデーションに簡単に変更できます。

'd'パラメーターの範囲は0から1であるため、距離が大きい場合は、この関数で使用するために距離を縮小することをお勧めします。

コードはRGBの色を取りますが、より良い補間のためにそれらをHSVに変換します。

import colorsys
import math

GRADIENT_SPEC = [
    (1.0, 1.0, 1.0),  # white
    (1.0, 0.0, 0.0),  # red
    (0.0, 1.0, 0.0),  # green
    (0.0, 0.0, 1.0),  # blue
    (0.0, 0.0, 0.0)]  # black

def gradient(d, spec=GRADIENT_SPEC):
    N = len(spec)
    idx = int(d * (N - 1))
    t = math.fmod(d * (N - 1), 1.0)
    col1 = colorsys.rgb_to_hsv(*spec[min(N - 1, idx)])
    col2 = colorsys.rgb_to_hsv(*spec[min(N - 1, idx + 1)])
    hsv = tuple(a * (1 - t) + b * t for a, b in zip(col1, col2))
    r, g, b = colorsys.hsv_to_rgb(*hsv)
    return '#%02X%02X%02X' % (r * 255, g * 255, b * 255)

for x in xrange(12):
    print x, gradient(x / 10.0)
于 2011-12-18T10:55:09.543 に答える