def rgb_to_int(r, g, b): return (r<<16|g<<8|b) def int_rgb_r(x): return (x >> 16) def int_rgb_g(x): return (x >> 8) & 0xff def int_rgb_b(x): return x & 0xff def mono_interpolate(v1, v2, t): return int(round((v2)*(t)+(v1)*(1-(t)))) def interpolate(c1, c2, t): r = mono_interpolate(int_rgb_r(c1), int_rgb_r(c2), t) g = mono_interpolate(int_rgb_g(c1), int_rgb_g(c2), t) b = mono_interpolate(int_rgb_b(c1), int_rgb_b(c2), t) return rgb_to_int(r, g, b) def to_colour(probability): min_colour = 0xFF4444 mid_colour = 0xFFFF44 max_colour = 0x44FF44 if probability <= 0.5: return interpolate(min_colour, mid_colour, probability * 2.0) else: return interpolate(mid_colour, max_colour, (probability - 0.5) * 2.0) def to_hex_string(c): return hex(c).replace('0x', '#')