我正在开发一个简单的程序,只需使用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
我得到的地图是:
有了Ignacio Vazquez-Abrams关于HSV的帮助,我看起来像这样:):
答案 0 :(得分:4)
答案 1 :(得分:1)
诀窍是单独处理三个字节 。我会按照我认为它应该工作的方式重新编写你的功能:
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
。
请注意,这不会考虑任何physiological properties of color - 可能有更多赏心悦目的方法来解决此问题。 (实际的颜色专家对计算机科学家选择的web-safe colors感到非常不满,因为数字涉及到... ...
答案 2 :(得分:1)
这是将插入任何多色渐变的代码。它设置为白色&gt;红色&gt;绿色&gt;蓝色&gt;黑色,但很容易将其更改为任何其他渐变。
'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)