Обработка цвета в Python - PullRequest
       4

Обработка цвета в Python

2 голосов
/ 15 сентября 2010

Для моего интерфейса кластеризации я в настоящее время использую случайные цвета для кластеров, так как я не буду знать заранее, сколько кластеров у меня будет в итоге.

В Python это выглядит так:

import random
def randomColor():
    return (random.random(),random.random(),random.random())

Однако, когда я обновляю вещи, цвета меняются.

Так что я бы предпочел иметь функцию с входным аргументом I, такую ​​как

def nonrandomColor(i):
   ...
   return color

всегда будет возвращать один и тот же цвет для одного и того же I, сохраняя при этом возможность генерировать произвольно много цветов.

Ответ не обязательно должен быть сформулирован в Python, его интересует скорее общий макет.

Ответы [ 5 ]

6 голосов
/ 15 сентября 2010

Одним из способов является использование кэширования.Используйте defaultdict:

>>> import random
>>> def randomColor():
...    return (random.random(),random.random(),random.random())
... 
>>> from collections import defaultdict
>>> colors = defaultdict(randomColor)
>>> colors[3]
(0.10726172906719755, 0.97327604757295705, 0.58935794305308264)
>>> colors[1]
(0.48991106537516382, 0.77039712435566876, 0.73707003166893892)
>>> colors[3]
(0.10726172906719755, 0.97327604757295705, 0.58935794305308264)
2 голосов
/ 15 сентября 2010

Просто установите seed генератора случайных чисел на индекс, это может быть дешевле, чем сохранение цветов.

random.seed(i)

Обратите внимание, что это сделает случайные числа way менее случайными, чем раньше. Если это проблема, например, если ваше приложение использует случайные числа в другом месте, вы можете посмотреть параметры кэширования, предлагаемые другими ответами.

1 голос
/ 15 сентября 2010

Если вы хотите, чтобы повторяющиеся цвета не сталкивались, вы можете использовать что-то вроде функции ниже.Он делит число на 1, 10, 100, а затем использует их как RGB-части цвета.

def color(i):
  r = i % 10
  g = (i//10) % 10
  b = (i//100) % 10
  return(r*25, g*25, b*25)

Например:

color(1) == (25,0,0)
color(10) == (0,25,0)
color(999) = (225,225,255)
1 голос
/ 15 сентября 2010

Вы хотите сохранить цвета в словаре или списке:

colors = {} # int -> color
def nonrandomColor(i):
   if i not in colors:
      colors[i] = randomColor()
   return colors[i] 
0 голосов
/ 15 сентября 2010

Вы можете использовать i для заполнения генератора случайных чисел.Таким образом, до тех пор, пока начальное число остается тем же, вы получаете одно и то же значение.

>>> import random
>>> random.seed(12)
>>> random.randint(0,255), random.randint(0,255), random.randint(0,255)
(121, 168, 170)
>>> random.seed(12)
>>> random.randint(0,255), random.randint(0,255), random.randint(0,255)
(121, 168, 170)
>>> random.seed(10)
>>> random.randint(0,255), random.randint(0,255), random.randint(0,255)
(146, 109, 147)
>>> random.seed(10)
>>> random.randint(0,255), random.randint(0,255), random.randint(0,255)
(146, 109, 147)

В зависимости от количества цветов, которые вы, вероятно, сгенерируете (т. Е. 10 или миллион), метод кэшированияможет быть лучше, чем метод seed().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...