# Color: as many unique color (vectors) as objects?

On 28/02/2014 at 14:45, xxxxxxxx wrote:

Hi everyone,

I want to assign every object a unique Color in the editor, the script works so far, but I am having trouble spacing and feeding the color vector with adequate numbers to have enough differentiation and not to exceed the 3 integers.

lets say I have 254*254*254 = 16387064 Colors at my disposal and I have 2Mio Objects. How do i feed the vector with a spacing (color differentiation) while having 3 parameters.

The cherry on top would be to exclude black, and white.

``````
counter = 2000000 # e.g. Number of Objects
step = (1/float(counter)) # somehow gives me a step but not robust

def getcolor (step, counter, secondcounter) :
colorvec = (step * secondcounter)
color = c4d.Vector(colorvec , colorvec , colorvec) # of course this alters all three vectors which limits me in color spacing ....
return color
``````

mogh

On 28/02/2014 at 18:18, xxxxxxxx wrote:

Give this a try.
It should theoretically generate a ton of unique colors.

``````import c4d
import random

def main() :

#Create a list array to hold all of the vector colors
colors = []

num_Colors = 100   #<--- Change this number as desired

#Generate lots of colors values between 0-255 using random
#Then test to see if the color already exist in the colors list
#If the color already exists..start the loop over again
#If the color is not in the list...Add it to the list
for i in xrange(num_Colors) :
vec = c4d.Vector(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))

if vec in colors: continue
else: colors.append(vec)

print colors

if __name__=='__main__':
main()
``````

-ScottA

On 01/03/2014 at 13:20, xxxxxxxx wrote:

Hi ScottA,

i tried this because your script didn't produce valid color vectors, found some similar script for random colors which had this division by 256 incorporated, don't know if this is the real deal but it gives me colors.

Anyway i still have trouble to exclude black and white, when the script finds the vec in the list it continues but does not add another value it seems, hence I get index out of range errors.

any idea?

``````def random_unique_colors(howmany) : #Create a list array to hold all of the vector colors
colors = []
white = c4d.Vector(1,1,1)
black = c4d.Vector(0,0,0)
for i in xrange(howmany) :
vec = c4d.Vector(random.randint(0, 255)/256.0, random.randint(0, 255)/256.0, random.randint(0, 255)/256.0)
if vec in colors or vec == white or vec == black: continue
else: colors.append(vec)
return colors
``````

On 01/03/2014 at 14:07, xxxxxxxx wrote:

Sorry to bother,
i tried it with 70.000 Objects and not getting nearly as many colors in the list - something is definitely wrong and slow.

I guess i really need some sort of "step" solution.

On 01/03/2014 at 15:37, xxxxxxxx wrote:

If you want values between 0-1 instead of 0-255. Then try it like this:

``````import c4d
import random

def main() :

#Create a list array to hold all of the vector colors
colors = []

num_Colors = 100   #<--- Change this number as desired

#Generate lots of colors values between 0-255 using random
#Then test to see if the color already exist in the colors list
#If the color already exists..start the loop over again
#If the color is not in the list...Add it to the list
for i in xrange(num_Colors) :
vec = c4d.Vector(float(random.randint(0, 255)/100.0), float(random.randint(0, 255)/100.0), float(random.randint(0, 255)/100.0))

if vec in colors: continue
else: colors.append(vec)

print colors

if __name__=='__main__':
main()
``````

This is going to be very slow because
a.) It's generating huge amounts of data
b.) It's looking through the list for already existing values every iteration of the loop. Which takes longer...depending on how many vectors are in the list.

I'm sure there's faster more optimized ways to generate large numbers of vectors. I just came up with this code off the top of my head.
If you don't mind the generated colors being sequential. Simply incrementing the values per loop iteration, and deleting all the random and the "if vec in colors:"  code I used, will speed it up a lot.
I just assumed that you didn't want the color values to be sequential.

-ScottA

On 02/03/2014 at 04:59, xxxxxxxx wrote:

Hi
If you want to limit the color range it might be easier to start in HSV.

``````
import c4d
from random import randint, randrange
from c4d import utils

def main() :
howMany = 1000
colors = []

# Change min/max to limit hue range ( degrees )
hueMin = 0
hueMax = 360

# Change min/max to limit saturation range ( % )
saturationMin = 0
saturationMax = 100

# Change min/max lo limit value range ( % )
valueMin = 0
valueMax = 100

for i in xrange(howMany) :
h = float(randrange( hueMin, hueMax )) / 360
s = float(randrange( saturationMin, saturationMax )) / 100
v = float(randrange( valueMin, valueMax )) / 100

# Convert hsv to rgb and append new value to list
colors.append(c4d.utils.HSVToRGB( c4d.Vector(h, s, v) ))

print colors

if __name__=='__main__':
main()
``````

I'm not sure if all these colors are completely unique.

Cheers
Bonsak

PS How do i set the line spacing inside the code block?

On 02/03/2014 at 05:06, xxxxxxxx wrote:

I came up with a quiet dirty method manipulating a string, but it works good and isn't to slow after all.

I do not need random! I need unique and well spaced colors because I am trying to code a object visibility plugin.

``````def unique_colors(howmany) : #Create a list array to hold all of the vector colors
if howmany == 0:
return False

colors = []
step = 999999998 / howmany # 0.999 0.999 0.999 divided by the objectcount
largestring = 1000000001 + (step/2) # puts the range in the middle betweeen black and white

for i in xrange(howmany) :
r = float(str(largestring)[1:-6])/1000
g = float(str(largestring)[4:-3])/1000
b = float(str(largestring)[7:])/1000
colors.append(c4d.Vector(r , g, b))
largestring = largestring + step
return colors
``````

On 02/03/2014 at 12:33, xxxxxxxx wrote:

I see. So you need a narrow range of hues, or the full spectrum devided evenly among the members?

Cheers
Bonsak

On 02/03/2014 at 13:02, xxxxxxxx wrote:

I need full spectrum devided evenly among the members, without black and white to prevent errors with the background.

kind regards
mogh

On 18/03/2014 at 13:57, xxxxxxxx wrote:

Still searching for a clean solution,

found this but can't implement it

http://stackoverflow.com/questions/470690/how-to-automatically-generate-n-distinct-colors

kind regards

On 10/04/2014 at 03:27, xxxxxxxx wrote:

found something:

``````g = itertools.product(range(1,255), repeat=3) # range excluding 0 and 256
for x in manycolors:
color = g.next()
``````

this creates as many colors as often you call g.next()

kind regards