Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Generating a rainbow?

19 views
Skip to first unread message

Tobiah

unread,
Apr 8, 2010, 12:46:08 PM4/8/10
to
I'm having a difficult time with this. I want
to display a continuous range of hues using HTML
hex representation (#RRGGBB). How would I go
about scanning through the hues in order to
make a rainbow?

Thanks,

Toby

Chris Colbert

unread,
Apr 8, 2010, 1:06:53 PM4/8/10
to Tobiah, pytho...@python.org
> --
> http://mail.python.org/mailman/listinfo/python-list
>

In [43]: possible = []

In [44]: for i in range(2**8):
....: h = hex(i).lstrip('0x')
....: while len(h) < 2:
....: h = '0' + h
....: possible.append(h)
....:
....:

In [45]: full = [r + g + b for r in possible for g in possible for b
in possible]

In [46]: len(full)
Out[46]: 16777216

In [47]: 2**24
Out[47]: 16777216

Richard Thomas

unread,
Apr 8, 2010, 1:08:17 PM4/8/10
to

Tobiah

unread,
Apr 8, 2010, 1:14:33 PM4/8/10
to

That so rocks. Thanks!

Chris Colbert

unread,
Apr 8, 2010, 1:23:10 PM4/8/10
to Tobiah, pytho...@python.org
> --
> http://mail.python.org/mailman/listinfo/python-list
>

How does that answer your original question?

Gary Herron

unread,
Apr 8, 2010, 1:14:43 PM4/8/10
to pytho...@python.org

Use the hue-saturation-value color space, and call hsv_to_rgb from the
standard Python library to convert to RGB. Enjoy!

Gary Herron


from colorsys import hsv_to_rgb

for hue ....:
rgb = hsv_to_rgb(hue, saturation, value)


Let 'hue' run from 0 (red) through 2/3 (blue) Hues from 2/3 to 1 get
into purples and magentas, which are not spectral (i.e., rainbow) colors.

Set 'saturation' to perhaps 0.5 (for a washed out effect) through 1.0
(for pure color). Even an intensely colorful rainbow has lots of white
light mixed in with it; a saturation of 0.5 is probably good.

Set 'value' to something in the range of 0 to 1 to control brightness.

Tobiah

unread,
Apr 8, 2010, 2:34:21 PM4/8/10
to
> How does that answer your original question?

I was able to do this:

import colorsys

sat = 1
value = 1
length = 1000
for x in range(0, length + 1):
hue = x / float(length)
color = list(colorsys.hsv_to_rgb(hue, sat, value))
for x in range(3):
color[x] = int(color[x] * 255)
hexval = ("#%02x%02x%02x" % tuple(color)).upper()
print "<div style='height: 1; width: 500; background-color: %s'>"
% hexval


http://tobiah.org/rainbow.html

Peter Parker

unread,
Apr 8, 2010, 4:39:17 PM4/8/10
to

Roy G. Biv would like you to order the colors according to their
wavelength. He would also like to see Orange and Yellow appear in
your rainbow.

Neil Hodgson

unread,
Apr 8, 2010, 6:02:21 PM4/8/10
to
Tobiah:

> for x in range(0, length + 1):

> ...
> for x in range(3):

You should use different variables for the two loops.

Neil

Neil Hodgson

unread,
Apr 8, 2010, 6:14:50 PM4/8/10
to
Me:

> You should use different variables for the two loops.

Actually it is closing the divs that makes it work in FireFox:

import colorsys

sat = 1
value = 1
length = 1000

for h in range(0, length + 1):
hue = h / float(length)


color = list(colorsys.hsv_to_rgb(hue, sat, value))
for x in range(3):
color[x] = int(color[x] * 255)
hexval = ("#%02x%02x%02x" % tuple(color)).upper()

print(


"<div style='height: 1; width: 500; background-color: %s'>"

"</div>" % hexval)

Chris Colbert

unread,
Apr 8, 2010, 6:28:27 PM4/8/10
to Tobiah, pytho...@python.org
> --
> http://mail.python.org/mailman/listinfo/python-list
>

I see. It appears I misunderstood the question.

The link doesn't work in Chrome btw.

Tobiah

unread,
Apr 9, 2010, 11:52:50 AM4/9/10
to

>> You should use different variables for the two loops.
>
> Actually it is closing the divs that makes it work in FireFox:
>

Hah. I new that the rainbow wasn't complete and that it
didn't work in Opera. I just fizzled on the closing of the
divs.

I also don't get why it worked at all when I was stomping
on my x variable in the inside loop.

It's better now.

http://tobiah.org/rainbow.html

Peter Parker

unread,
Apr 11, 2010, 1:54:38 PM4/11/10
to

Better than before ... Oy G. Bivr

Robert Kern

unread,
Apr 11, 2010, 6:21:20 PM4/11/10
to pytho...@python.org

Uh, the first color is #FF0000, pure red, not orange.

--
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
that is made terrible by our own mad attempt to interpret it as though it had
an underlying truth."
-- Umberto Eco

Peter Parker

unread,
Apr 11, 2010, 10:26:07 PM4/11/10
to
Robert Kern wrote:
> On 2010-04-11 12:54 , Peter Parker wrote:
>> Tobiah wrote:
>>>>> You should use different variables for the two loops.
>>>> Actually it is closing the divs that makes it work in FireFox:
>>>>
>>>
>>> Hah. I new that the rainbow wasn't complete and that it
>>> didn't work in Opera. I just fizzled on the closing of the
>>> divs.
>>> I also don't get why it worked at all when I was stomping
>>> on my x variable in the inside loop.
>>>
>>> It's better now.
>>>
>>> http://tobiah.org/rainbow.html
>>
>> Better than before ... Oy G. Bivr
>
> Uh, the first color is #FF0000, pure red, not orange.
>

Ah, you're right, but it's only 1 pixel high so it's hard to
see. The last one is also #FF0000, pure red ... Roy G. Bivr

Giacomo Boffi

unread,
Apr 13, 2010, 9:51:12 AM4/13/10
to
Tobiah <to...@rcsreg.com> writes:

if you mean real rainbows when you say "rainbow", as rainbows go from
low to high wavelengths and you have to specify colors to your display
in RGB, i think that you have to read, e.g.,

http://www.physics.sfasu.edu/astro/color.html

otoh if you mean simply a continuos palette with varying hues,
excellent answers were already posted

hth
g
--
compro mobili vecchi - vendo mobili antichi

0 new messages