使用python id()函数生成随机颜色

时间:2017-02-13 06:01:52

标签: python python-2.7 colors

情境: 作为3D游戏引擎的一部分,我想实现像素完美的鼠标选择" (基本上允许用户点击场景中的不同3D模型)。一种方法是将场景渲染到纹理,其中每个对象随机着色为单一的平面颜色。然后,当用户点击屏幕时,我只是得到光标下方的颜色,我就会知道我在场景中点击了哪个对象。当然,我想确保每个模型都赋予它独特的颜色。颜色本身并不太重要,因为它永远不会呈现在屏幕上。

实际问题: 由于我有一个Model类,当我在python中创建不同的模型对象时,我知道每个在python中都有一个不同的id()值。鉴于这个独特的内存地址值,有没有办法生成一个独特的RGB浮点颜色三元组?

修改 在@Jack Witherell的回答之后,这里有一些实现这个想法的代码:

def get_pick_color(model):
    model_id = id(model)
    r = int(model_id/(256**3))
    g = int(model_id%(256**3)/(256**2))
    b = int(model_id%(256**2)/256)
    a = int(model_id%256)
    return (r, g, b, a)

for model in range(10):
    print model, id(model), get_pick_color(model)

示例输出:

0 50096352 (2, 252, 104, 224)
1 50096328 (2, 252, 104, 200)
2 50096304 (2, 252, 104, 176)
3 50096280 (2, 252, 104, 152)
4 50096256 (2, 252, 104, 128)
5 50096232 (2, 252, 104, 104)
6 50096208 (2, 252, 104, 80)
7 50096184 (2, 252, 104, 56)
8 50096160 (2, 252, 104, 32)
9 50096136 (2, 252, 104, 8)

1 个答案:

答案 0 :(得分:1)

它取决于id格式的值。如果您知道该值只是一个整数,您可以尝试将r设置为id()%256,将g设置为id()/ 256以获取颜色值。这将适应大约65536个不同对象ID的不同值。

例如,如果您有1,103个对象,并且您单击了1098,则r将等于74且g将等于4,因为:

1098%256等于74 (1098-256-256-256-256 = 74)

经过四舍五入后,

和1098/256 = 4。

如果适用,您可以将其扩展为另外两种颜色值,蓝色和alpha。每个像素的颜色值看起来有点像这样

(id()/ 16777216,(id()%16777216)/ 65536,(id()%65536)/ 256,id()%2 56)

假设id()输出数字54421704,颜色值将等于

(3,62,104,200)

对于数字54421704应该是唯一的