I wrote this for a project where I was trying to develop my own (more elegant) HSB formula, well this piece will give you ALL hue's in the full color spectrum in 24bit color space.
Put this BEFORE the RENDERING LOOP... it's way too big to recalculate over and over.
(this might not be the best way, but it will work if you can think of a creative way to implement it... which I'll leave up to you... hehe :-)
Make this vector GLOBAL:
Code:
vector<int> vrINT;
const int LMAX = 256;
Put this where it will execute BEFORE rendering loop:
Code:
for (int k=0; k<3; ++k)
for (intj=1; j>=0; --j)
for (inti=0; i<LMAX; ++i)
{
if (j==1)
aRGB[(k+j)%3] = i;
else
aRGB[(k+j)%3] = (LMAX-1) - i;
vrINT.push_back(
RGBtoINT(aRGB[0], aRGB[1], aRGB[2])
);
}
You'll need this function as well:
Code:
int RGBtoINT (int r, int g, int b)
{
// assuming r|g|b is > 0 and <= 255
if (r>255) r = 255;
if (g>255) g = 255;
if (b>255) b = 255;
int cR=0, cG=0, cB=0;
cR = r; // cR = 0xRR000000
cG = cR << 8; // cG = 0x00RR0000
cG = cG | g; // cG = 0xGGRR0000
cB = cG << 8; // cB = 0x00GGRR00
cB = cB | b; // cB = 0xBBGGRR00
return cB;
}
to get the RGB back IN RENDERING to put in to glColorf(R, G, B) use:
Code:
int sINT[] = {0, 0, 0}; // <-- GLOBAL, put it where ever you define vrINT
void INTtoRGB (int k)
{
sINT[0] = (k >> 16) & 0xFF;
sINT[1] = (k >> 8) & 0xFF;
sINT[2] = (k) & 0xFF;
}
then in the rendering bit...
Code:
glBegin(GL_LINE_STRIP);
for (m=0; m<LoopM; ++m)
{
INTtoRGB( vrINT.at( m%vrINT.size() ) );
glColor3f(
sINT[0]/255.0,
sINT[1]/255.0,
sINT[2]/255.0);
glVertex3f(
cvx.at(m), // i rendered screen x axis coords to doubles in this vector (x/app_width)
cvy.at(m), // same for y axis (y/app_width)
0.0 );
}
glEnd();
Now you have the full spectrum of HUES!! Adjust your calculations to do what ever you want with em!
Enjoy!