File size: 2,075 Bytes
9913017 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | // colorcode.cpp
//
// Color encoding of flow vectors
// adapted from the color circle idea described at
// http://members.shaw.ca/quadibloc/other/colint.htm
//
// Daniel Scharstein, 4/2007
// added tick marks and out-of-range coding 6/05/07
#include <stdlib.h>
#include <math.h>
typedef unsigned char uchar;
int ncols = 0;
#define MAXCOLS 60
int colorwheel[MAXCOLS][3];
void setcols(int r, int g, int b, int k)
{
colorwheel[k][0] = r;
colorwheel[k][1] = g;
colorwheel[k][2] = b;
}
void makecolorwheel()
{
// relative lengths of color transitions:
// these are chosen based on perceptual similarity
// (e.g. one can distinguish more shades between red and yellow
// than between yellow and green)
int RY = 15;
int YG = 6;
int GC = 4;
int CB = 11;
int BM = 13;
int MR = 6;
ncols = RY + YG + GC + CB + BM + MR;
//printf("ncols = %d\n", ncols);
if (ncols > MAXCOLS)
exit(1);
int i;
int k = 0;
for (i = 0; i < RY; i++) setcols(255, 255*i/RY, 0, k++);
for (i = 0; i < YG; i++) setcols(255-255*i/YG, 255, 0, k++);
for (i = 0; i < GC; i++) setcols(0, 255, 255*i/GC, k++);
for (i = 0; i < CB; i++) setcols(0, 255-255*i/CB, 255, k++);
for (i = 0; i < BM; i++) setcols(255*i/BM, 0, 255, k++);
for (i = 0; i < MR; i++) setcols(255, 0, 255-255*i/MR, k++);
}
void computeColor(float fx, float fy, uchar *pix)
{
if (ncols == 0)
makecolorwheel();
float rad = sqrt(fx * fx + fy * fy);
float a = atan2(-fy, -fx) / M_PI;
float fk = (a + 1.0) / 2.0 * (ncols-1);
int k0 = (int)fk;
int k1 = (k0 + 1) % ncols;
float f = fk - k0;
//f = 0; // uncomment to see original color wheel
for (int b = 0; b < 3; b++) {
float col0 = colorwheel[k0][b] / 255.0;
float col1 = colorwheel[k1][b] / 255.0;
float col = (1 - f) * col0 + f * col1;
if (rad <= 1)
col = 1 - rad * (1 - col); // increase saturation with radius
else
col *= .75; // out of range
pix[2 - b] = (int)(255.0 * col);
}
}
|