All pastes #397014 Raw Edit

Stuff

public cpp v1 · immutable
·published 2007-03-16 04:36 UTC
rendered paste body
/*** Robert Krzyzanowski* Buffon's Needle* MTH341 Enrichment*/#include <windows.h>#include <fstream>#include <GL/glut.h>#include <iostream>#include <conio.h>#include <iomanip>#include <stdio.h>#include <math.h>#include <vector>#include <time.h>#include <iomanip>using namespace std;typedef vector<float> needle;vector<needle> needles;void main(int, char**);void display(void);void drawField(void);void dropNeedle(void);void drawNeedles(void);void displayInfo(void);bool needleOnLine(needle n);// Pre-defined colorsenum colorDefs {PBLACK, PWHITE, PRED, PBLUE, PGREEN, PCYAN, PMAGENTA, PYELLOW, PGRAY};float colors[9][3] = {{0.0f,0.0f,0.0f}, {1.0f,1.0f,1.0f}, {1.0f,0.0f,0.0f},{0.0f,0.0f,0.5f}, {0.0f,0.5f,0.0f}, {0.0f, 0.8f, 0.8f}, {0.4f, 0.0f, 0.4f},{1.0f, 1.0f, 0.0f}, {0.5f, 0.5f, 0.5f}};// Graphical variables.int scrWidth = 800, scrHeight = 800;							// Screen width and height.int scrX = 250, scrY = 100;										//Screen X and Y.char*  winTitle = "Buffon's Needles by Robert Krzyzanowski";	// Window title.float D = 100;float L = 0;int C = 5;int lastClock = 0;int needlesOnD = 0;void main(int argc, char** argv){	glutInit(&argc, argv);	glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);	glutInitWindowSize(scrWidth, scrHeight);	glutInitWindowPosition(scrX,scrY);	glutCreateWindow(winTitle);	glutDisplayFunc(display);	glutIdleFunc(display);	glClearColor(1.0, 1.0, 1.0, 1.0);	glColor3f(0.0, 0.0, 0.0);	glMatrixMode(GL_PROJECTION);	glLoadIdentity();	gluOrtho2D(0.0, (float)scrWidth, 0.0, (float)scrHeight);	glMatrixMode(GL_MODELVIEW);	srand(time(NULL));		for(int i =0;i<100;i++)rand();	if (argc >= 2) D = atof(argv[1]);	if (argc >= 3) L = atof(argv[1]);	if (argc >= 4) C = atoi(argv[1]); if (C <= 0) C = 5;	if (D<=0)D=100;if(L<=0)L=((float)rand()/RAND_MAX)*D;	glutMainLoop();	cout << "\n\nPress enter to end.\n"; while (getch()!='\r');	}void display(void){	glClear(GL_COLOR_BUFFER_BIT);	glColor3fv(colors[PWHITE]);	glBegin(GL_QUADS);		glVertex2f(0.0f, 0.0f);		glVertex2f(0.0f, scrHeight);		glVertex2f(scrWidth, scrHeight);		glVertex2f(scrWidth, 0.0f);	glEnd();	if (clock() - lastClock > C) {		lastClock = clock();		dropNeedle();	}	drawField();	drawNeedles();}void drawField() {	glColor3fv(colors[PBLACK]);	glBegin(GL_LINES);	for(int i = 1; i*D < scrHeight; i++) {		glVertex2f(0.0f, i*D);		glVertex2f(scrWidth, i*D);	}	glEnd();}void dropNeedle() {	needle n;	n.push_back(((float)rand()/RAND_MAX)*scrWidth);	n.push_back(((float)rand()/RAND_MAX)*scrHeight);	n.push_back(((float)rand()/RAND_MAX)*3.14159);	needles.push_back(n);	if (needleOnLine(n)) needlesOnD++;	displayInfo();}void drawNeedles() {	glBegin(GL_LINES);	for(int i = 0; i < needles.size(); i++) {		needle n = needles[i];		if ( needleOnLine(n) ) {			glColor3fv(colors[PRED]);		}		else {			glColor3fv(colors[PBLACK]);		}		glVertex2f(n[0] + L/2 * sin(n[2]), n[1] - L/2 * cos(n[2]));		glVertex2f(n[0] - L/2 * sin(n[2]), n[1] + L/2 * cos(n[2]));			}	glEnd(); }double absf(float f) {	return (f>0?f:-f);}void displayInfo() {	system("cls");	float ratio = (float)needlesOnD / needles.size() ;	float Tratio = 2*L/(3.14159*D);	double pi_est = 1/((double)needlesOnD / needles.size())*2*L/D;	cout << "Buffon's Needle by Robert Krzyzanowski\n";	cout << "**************************************\n";	cout << "D: " << setprecision(2) << fixed << D << "\tL: " << setprecision(2) << fixed << L << endl;	cout << "Needles dropped: " << needles.size() << endl;	cout << "Needles on a line: " << needlesOnD << endl;	cout << "Needles not on a line: " << (needles.size() - needlesOnD) << endl;	cout << "Ratio: " << setprecision(3) << ratio << endl;	cout << "Theoretical estimate: 2L/pi*D = " << Tratio << endl;	cout << "Error: " << setprecision(2) <<(ratio>0?((float)absf(ratio-Tratio)/ratio*100):999) << "%" << endl;	cout << "Estimate of pi: " << pi_est << endl;}bool needleOnLine(needle n) {	return (abs(floor((n[1] + L/2 * cos(n[2]))/D) - floor((n[1] - L/2 * cos(n[2]))/D)) > 0);}