/* dive.c */ #include #include #define ASPECT (3.0 / 4.0) #define OFFSET (1.0 / 8.0) int ul_x0; int ul_y0; int ul_x1; int ul_y1; int ll_x0; int ll_y0; int ll_x1; int ll_y1; int printline( char tag[], int x0, int y0, int x1, int y1) { fprintf(stderr, "%s: (%d, %d) (%d, %d) \n", tag, x0, y0, x1, y1); } int make_line_defs( int w, int h) { int pixoff = w * OFFSET; ul_x0 = pixoff; ul_y0 = h - 1; ul_x1 = w - 1; ul_y1 = pixoff; printline("Upper", ul_x0, ul_y0, ul_x1, ul_y1); ll_x0 = 0; ll_y0 = h - 1 - pixoff; ll_x1 = w - 1 - pixoff; ll_y1 = 0; printline("Lower", ll_x0, ll_y0, ll_x1, ll_y1); } int write_red_pixel() { fprintf(stdout, "%c%c%c", 250, 0, 0); } int write_white_pixel() { fprintf(stdout, "%c%c%c", 250, 250, 250); } int make_pixel( int x, int y) { if (isAbove(x, y, ul_x0, ul_y0, ul_x1, ul_y1)) write_red_pixel(); else if (isAbove(x, y, ll_x0, ll_y0, ll_x1, ll_y1)) write_white_pixel(); else write_red_pixel(); } int write_row( int w, int h, int row) { int x; int y; y = row; x = 0; while (x < w) { make_pixel(x, y); x = x + 1; } } int make_ppm_hdr( int w, int h) { fprintf(stdout, "P6\n"); fprintf(stdout, "%d %d %d\n", w, h, 255); } int main( int argc, char *argv[]) { int width = 0; int height; int row; int col; if (argc < 2) { fprintf(stderr, "usage is: dive width-of-flag \n"); exit(-1); } sscanf(argv[1], "%d", &width); height = width * ASPECT; fprintf(stderr, "%d %d\n", width, height); make_ppm_hdr(width, height); make_line_defs(width, height); row = height - 1; while (row >= 0) { write_row(width, height, row); row = row - 1; } }