Как именно работают шестнадцатеричные цветовые коды?/ Как реализовать что-то вроде тепловой карты - PullRequest
3 голосов
/ 18 декабря 2011

Я работаю над простой программой, чтобы просто рисовать круги вокруг некоторых фиксированных точек с помощью пакета черепах Python; тем не менее, я хотел сделать это как тепловую карту, где цвета становятся «холоднее» по мере того, как они удаляются от первоначальной точки. Моя идея состояла в том, чтобы взять базовый белый цвет, #FFFFFF, и вычесть процент, основанный на этом на расстоянии.

Я предположил, что шестнадцатеричные цветовые коды работали, уменьшая свое шестнадцатеричное значение, поскольку цвет становится «холоднее», но я теперь прочитал, что первые два означают его красное значение, второе - зеленый, а последнее - синий. Как мне реализовать тепловую карту так, как я хочу, чтобы она работала?

Я уверен, что расстояния правильные, я просто думаю, что неправильно использую цветовые коды. Функция, которую я написал для вычисления цвета:

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

В результате получается карта:

circle heat map

С помощью Игнасио Васкеса-Абрамса о HSV я выгляжу так :):

Updated color algorithm

Ответы [ 3 ]

4 голосов
/ 18 декабря 2011

Вы хотите использовать HSV вместо RGB для цветов; скользить по размеру оттенка для ваших расстояний. colorsys может помочь.

1 голос
/ 18 декабря 2011

Вот код, который будет интерполировать любой многоцветный градиент. Он настроен на белый / красный> зеленый> синий> черный, но его легко изменить на любой другой градиент.

Диапазон для параметра '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)
1 голос
/ 18 декабря 2011

Хитрость заключается в том, чтобы работать с тремя байтами по отдельности .Я попробую переписать вашу функцию так, как я думаю, она должна работать:

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 или 0xFF00 или 0xFF, если вам нужен постоянный градиент красного, зеленого или синего.)

Обратите внимание, что это не требует каких-либо физиологических свойствцвет во внимание - может быть больше приятных способов подойти к этому.(Фактические специалисты по цвету были весьма расстроены веб-безопасными цветами , которые были выбраны компьютерными учеными как приятные из-за чисел , связанных с ...)

...