// rainbow rings // #include #include #include "ppm.h" #define N 401 // N-by-N pixels total #define R 25 // ring radius #define C 200 // center x,y coordinates // RGB values for Roy G. Biv // from https://simple.wikipedia.org/wiki/Rainbow // struct { int r, g, b; } rgb[] = { { 0, 0, 0 }, // black { 255, 0, 0 }, // red { 255, 127, 0 }, // orange { 255, 255, 0 }, // yellow { 0, 255, 0 }, // green { 0, 0, 255 }, // blue { 75, 0, 130 }, // indigo { 139, 0, 255 }, // violet { 255, 255, 255 } // white }; // interpolate, a + alpha*(b-a), 0.0 <= alpha <= 1.0 // int interp( double alpha, int a, int b) { return 0.5 + a + alpha*(b-a); // round to int } // square // double sqr( double x) { return x*x; } int main( void) { ppm a = ppm_new( N, N); for( int i = 0; i < N; ++i) for( int j = 0; j < N; ++j) { double r = sqrt( sqr(i-C) + sqr(j-C)); // distance from center r /= R; // RBG array index if( r >= 8) // too big, make it white { a.r[i][j] = a.g[i][j] = a.b[i][j] = 255; continue; } int k = r; // RBG lower index double alpha = r - k; // interpolation factor a.r[i][j] = interp( alpha, rgb[k].r, rgb[k+1].r); a.g[i][j] = interp( alpha, rgb[k].g, rgb[k+1].g); a.b[i][j] = interp( alpha, rgb[k].b, rgb[k+1].b); } ppm_write( a); return 0; }