#include <stdlib.h> #include <stdio.h> #include <math.h> /* waves */ int main(int argc, char *argv[]) { int r, nrows, c, ncols, red, grn, blu; double redFreq=1.0, grnFreq=2.0, bluFreq=3.0; FILE *image; /* check the command line parameters */ if ( argc != 7 ) { printf("colorWaves fileName.ppm nrows ncols redFreq grnFreq bluFreq\n"); return 0; } /* open the image file for writing in binary mode */ if ( (image = fopen( argv[1], "wb") ) == NULL ) { printf("file %s could not be created\n", argv[1]); return 0; } nrows = atoi( argv[2] ); if ( nrows < 1 ) { printf("number of rows must be positive\n"); return 0; } ncols = atoi( argv[3] ); if ( ncols < 1 ) { printf("number of columns must be positive\n"); return 0; } /* get the number of cycles for each color */ redFreq = atof( argv[4] ); grnFreq = atof( argv[5] ); bluFreq = atof( argv[6] ); if ( redFreq<0.0 || grnFreq<0.0 || bluFreq<0.0 ) { printf("color frequency must be positive\n"); return 0; } /* write out the PPM Header information */ fprintf( image, "P6 "); fprintf( image, "%d %d %d ", ncols, nrows, 255 ); srand( time(NULL) ); /* write out the pixel data */ for ( r=0; r<nrows; r++ ) for ( c=0; c<ncols; c++ ) { red = (int)(125*cos(2.0*M_PI*c/ncols*redFreq)) + 125; grn = (int)(125*cos(2.0*M_PI*c/ncols*grnFreq)) + 125; blu = (int)(125*cos(2.0*M_PI*c/ncols*bluFreq)) + 125; fputc( red, image ); fputc( grn, image ); fputc( blu, image ); } /* close the file */ fclose ( image ); return 1; }
Comments: You need to be careful that each wave never exceeds the limits of 0 and 255 or the image will show odd effects due to overflow. In the above, the top limit is 250.