[SWF(width=720,height=360,backgroundColor=0x000000,frameRate=30)]
// ported from here:
//http://www.cs.rit.edu/~ncs/color/t_convert.html
function hsv(h:Number, s:Number, v:Number):Array{
var r:Number, g:Number, b:Number;
var i:int;
var f:Number, p:Number, q:Number, t:Number;
if (s == 0){
r = g = b = v;
return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
}
h /= 60;
i = Math.floor(h);
f = h - i;
p = v * (1 - s);
q = v * (1 - s * f);
t = v * (1 - s * (1 - f));
switch( i ) {
case 0:
r = v;
g = t;
b = p;
break;
case 1:
r = q;
g = v;
b = p;
break;
case 2:
r = p;
g = v;
b = t;
break;
case 3:
r = p;
g = q;
b = v;
break;
case 4:
r = t;
g = p;
b = v;
break;
default: // case 5:
r = v;
g = p;
b = q;
break;
}
return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
}
//
// -- test it out by drawing a few things
//
var canvas:BitmapData = new BitmapData(720, 360, false, 0x000000);
addChild(new Bitmap(canvas));
canvas.lock();
var size:int = canvas.width * canvas.height;
var xp:int, yp:int, c:Array, i:int;
for (i = 0; i<size; i++){
xp = i % 360;
yp = i / 360;
c = hsv(xp, 1, yp / 360);
canvas.setPixel(xp, yp, c[0] << 16 | c[1] << 8 | c[2]);
}
var dx:Number, dy:Number, dist:Number, ang:Number;
for (i = 0; i<size; i++){
xp = i % 360;
yp = i / 360;
dx = xp - 180;
dy = yp - 180;
dist = 1 - Math.sqrt((dx * dx) + (dy * dy)) / 360;
ang = Math.atan2(dy, dx) / Math.PI * 180;
if (ang < 0){
ang += 360;
}
c = hsv(ang, 1, dist);
canvas.setPixel(360 + xp, yp, c[0] << 16 | c[1] << 8 | c[2]);
}
canvas.unlock();
This is one of those things I’ve been meaning to play with for awhile. The above demos a function called hsv() which takes 3 arguments: angle (0-360), saturation(0-1) and value(0-1). The function returns an array of rgb values each with a range of (0-255).
There’s some room for optimization here, but for clarity I left as is. Even just playing with HSV (also know as HSB) for a few minutes, I see some interesting potential for dynamically generating color palettes for generative style experiments.
I looked around for the most elegant looking code snippet to port in order to write this… I eventually stumbled upon this great resource.
If you test the above on your timeline it will generate this image:

I usually only post one snippet a day… not sure why I decided to post two today.