INFO1-CE9264 June 18, 2012

Flag is simpler with absolute value

#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
	const int width = 300;			//number of columns of pixels
	const int height = width * 2 / 3;	//number of rows of pixels

	const int xmax = width / 2;		//place origin at center
	const int ymax = height / 2;
	const int xmin = xmax - width;
	const int ymin = ymax - height;

	cout << "P3\n"		//magic number of Netpbm .ppm file
		<< width << " " << height << "\n"
		<< 255 << "\n";

	//Draw flag of England.

	for (int y = ymax - 1; y >= ymin; --y) {
		for (int x = xmin; x < xmax; ++x) {
			if (x < -10 && y > 10) {
				//upper left quadrant is white
				cout << 255 << "\t" << 255 << "\t" << 255 << "\n";
			} else if (x > 10 && y > 10) {
				//upper right quadrant is white
				cout << 255 << "\t" << 255 << "\t" << 255 << "\n";
			} else if (x > 10 && y < -10) {
				//bottom right quadrant is white
				cout << 255 << "\t" << 255 << "\t" << 255 << "\n";
			} else if (x < -10 && y < -10) {
				//bottom left quadrant is white
				cout << 255 << "\t" << 255 << "\t" << 255 << "\n";
			} else {
				//red cross (internal border) with 20 separating the quadriants
				cout << 255 << "\t" << 0 << "\t" << 0 << "\n";
			}
		}
	}

	return EXIT_SUCCESS;
}

Simpler to draw the foreground first.

#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
	const int width = 300;			//number of columns of pixels
	const int height = width * 2 / 3;	//number of rows of pixels

	const int xmax = width / 2;		//place origin at center
	const int ymax = height / 2;
	const int xmin = xmax - width;
	const int ymin = ymax - height;

	cout << "P3\n"		//magic number of Netpbm .ppm file
		<< width << " " << height << "\n"
		<< 255 << "\n";	//maximum color value; 0 is minimum

	//Draw flag of England.

	for (int y = ymax - 1; y >= ymin; --y) {
		for (int x = xmin; x < xmax; ++x) {
			if (x >= -10 && x <= 10) {
				//vertical red stripe
				cout << 255 << "\t" << 0 << "\t" << 0 << "\n";
			} else (y >= -10 && y <= 10) {
				//horizontal red stripe
				cout << 255 << "\t" << 0 << "\t" << 0 << "\n";
			} else {
				//white background
				cout << 255 << "\t" << 255 << "\t" << 255 << "\n";
			}
		}
	}

	return EXIT_SUCCESS;
}

Consolidate the repetition with || (“or”).

#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
	const int width = 300;			//number of columns of pixels
	const int height = width * 2 / 3;	//number of rows of pixels

	const int xmax = width / 2;		//place origin at center
	const int ymax = height / 2;
	const int xmin = xmax - width;
	const int ymin = ymax - height;

	cout << "P3\n"		//magic number of Netpbm .ppm file
		<< width << " " << height << "\n"
		<< 255 << "\n";	//maximum color value; 0 is minimum

	//Draw flag of England.

	for (int y = ymax - 1; y >= ymin; --y) {
		for (int x = xmin; x < xmax; ++x) {
			if (x >= -10 && x <= 10			//vertical red stripe
				|| y >= -10 && y <= 10) {	//horizontal red stripe
				cout << 255 << "\t" << 0 << "\t" << 0 << "\n";
			} else {
				//white background
				cout << 255 << "\t" << 255 << "\t" << 255 << "\n";
			}
		}
	}

	return EXIT_SUCCESS;
}

Consolidate the repetition with abs (absolute value).

#include <iostream>
#include <cstdlib>	//for abs
using namespace std;

int main()
{
	const int width = 300;			//number of columns of pixels
	const int height = width * 2 / 3;	//number of rows of pixels

	const int xmax = width / 2;		//place origin at center
	const int ymax = height / 2;
	const int xmin = xmax - width;
	const int ymin = ymax - height;

	cout << "P3\n"		//magic number of Netpbm .ppm file
		<< width << " " << height << "\n"
		<< 255 << "\n";	//maximum color value; 0 is minimum

	//Draw flag of England.

	for (int y = ymax - 1; y >= ymin; --y) {
		for (int x = xmin; x < xmax; ++x) {
			if (abs(x) <= 10 || abs(y) <= 10) {
				//vertical or horizontal red stripe
				cout << 255 << "\t" << 0 << "\t" << 0 << "\n";
			} else {
				//white background
				cout << 255 << "\t" << 255 << "\t" << 255 << "\n";
			}
		}
	}

	return EXIT_SUCCESS;
}

Even better: change 10 to width / 30.

Flag is simpler if you put the origin in the right place

The stripes cross at the point that is 40 pixels to the right of the center of the flag.

//This program produces a Swedish flag in RGB values
#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
	const int width = 300;			//number of columns of pixels
	const int height = width * 2 / 3;	//number of rows of pixels

	const int xmax = width / 2;		//place origin at center
	const int ymax = height / 2;
	const int xmin = xmax - width;
	const int ymin = ymax - height;


	int stripes_width = width/20;
	
	cout << "P3\n"		//magic number of Netpbm .ppm file
		<< width << " " << height << "\n"
		<< 255 << "\n";	//maximum color value; 0 is minimum

	for (int y = ymax - 1; y >= ymin; --y) {
		for (int x = xmin; x < xmax; ++x) {
			if ((x >= -stripes_width - 40 && x <= stripes_width - 40) || (y >= -stripes_width && y <= stripes_width) ) {
				//yellow cross
				cout << 255 << "\t" << 204 << "\t" << 0 << "\n";
			} else {
				//blue background
				cout << 0 << "\t" << 127 << "\t" << 229 << "\n";
			}
		}
	}

	return EXIT_SUCCESS;
}

Let’t put the origin (0, 0) at the point where the stripes cross. x will go from –100 to 189. This will eliminate 60,000 pairs of subtractions. stripes_width should be const.

//This program produces a Swedish flag in RGB values
#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
	const int width = 300;			//number of columns of pixels
	const int height = width * 2 / 3;	//number of rows of pixels

	const int xmax = width * 19 / 30;	//place origin where stripes cross
	const int ymax = height / 2;
	const int xmin = xmax - width;
	const int ymin = ymax - height;

	const int stripes_width = width / 20;		//half of width of stripe
	
	cout << "P3\n"		//magic number of Netpbm .ppm file
		<< width << " " << height << "\n"
		<< 255 << "\n";	//maximum color value; 0 is minimum

	for (int y = ymax - 1; y >= ymin; --y) {
		for (int x = xmin; x < xmax; ++x) {
			if (x >= -stripes_width && x <= stripes_width || y >= -stripes_width && y <= stripes_width) {
				//yellow cross
				cout << 255 << "\t" << 204 << "\t" << 0 << "\n";
			} else {
				//blue background
				cout << 0 << "\t" << 127 << "\t" << 229 << "\n";
			}
		}
	}

	return EXIT_SUCCESS;
}

Consolidate the repetition with abs (absolute value).

//This program produces a Swedish flag in RGB values
#include <iostream>
#include <cstdlib>	//for abs
using namespace std;

int main()
{
	const int width = 300;			//number of columns of pixels
	const int height = width * 2 / 3;	//number of rows of pixels

	const int xmax = width * 19 / 30;	//place origin where stripes cross
	const int ymax = height / 2;
	const int xmin = xmax - width;
	const int ymin = ymax - height;

	const int stripes_width = width / 20;		//half of width of stripe
	
	cout << "P3\n"		//magic number of Netpbm .ppm file
		<< width << " " << height << "\n"
		<< 255 << "\n";	//maximum color value; 0 is minimum

	for (int y = ymax - 1; y >= ymin; --y) {
		for (int x = xmin; x < xmax; ++x) {
			if (abs(x) <= stripes_width || abs(y) <= stripes_width) {
				//yellow cross
				cout << 255 << "\t" << 204 << "\t" << 0 << "\n";
			} else {
				//blue background
				cout << 0 << "\t" << 127 << "\t" << 229 << "\n";
			}
		}
	}

	return EXIT_SUCCESS;
}

Even shorter:

			if (min(abs(x), abs(y)) <= stripes_width) {

Simpler with an array of structures

quadrant is an int whose value is 0, 1, 2, or 3.

	// set the quadrant controls
	int qc_w, qc_h;

	if ( quadrant == 0 || quadrant == 1 )
	{
		qc_w = 1;
	}
	else
	{
		qc_w = -1;
	}

	if ( quadrant == 0 || quadrant == 3 )
	{
		qc_h = 1;
	}
	else
	{
		qc_h = -1;
	}

qc_w and qc_h can now be const.

struct quad {
	int width;
	int height;
};

	static const quad[] {
		{ 1,  1},	//upper right
		{ 1, -1},	//lower right
		{-1, -1},	//lower left
		{-1,  1}	//upper left
	};

	const int qc_w = quad[quadrant].width;
	const int qc_h = quad[quadrant].height;