四叶图-openGL 例子,第四章。计算机图形学 中例子 代码有点瑕疵

第四版 计算机图形学 中例子 代码有点瑕疵,见下图,本道长保证这个程序没有运行过。

可运行代码如下。

#include "stdafx.h"
#include <GL/glut.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
using namespace std;

struct screenPt
{
	GLint x;
	GLint y;
};

typedef enum {
	limacon = 1,
	cardioid,
	threeLeaf,
	fourLeaf,
	spiral
} curveName;

GLsizei winWidth = 600, winHeight = 500;
void init(void) {
	glClearColor(1.0,1.0,1.0,1.0);
	glMatrixMode(GL_PROJECTION);
	gluOrtho2D(0.0,200.0,0.0,150.0);
}

void lineSegment(screenPt pt1,screenPt pt2) {
	glBegin(GL_LINES);
		glVertex2i(pt1.x,pt1.y);
		glVertex2i(pt2.x,pt2.y);
	glEnd();
}

void drawCurve(GLint curveNum) {

	const GLdouble twoPi = 6.283185;
	const GLint a = 175, b = 60;
	GLfloat r, theta, dtheta = 1.0 / float(a);
	GLint x0 = 200, y0 = 250;
	screenPt curvePt[2];

	glColor3f(0.0,0.0,0.0);

	curvePt[0].x = x0;
	curvePt[0].y = y0;

	switch (curveNum) {
		case limacon: curvePt[0].x += a + b; break;
		case cardioid:curvePt[0].x += a + a; break;
		case threeLeaf: curvePt[0].x += a; break;
		case fourLeaf: curvePt[0].x += a; break;
		case spiral: break;
		default: break;
	}
	 
	theta = dtheta;
	while (theta < twoPi) {
		switch (curveNum)
		{
		case limacon: 
			r = a * cos(theta) + b; break;
   	    case cardioid:
			r = a * (1 + cos(theta)); break;
		case threeLeaf:
			r = a * cos(3 * theta); break;
		case fourLeaf:
			r = a * cos(2 * theta); break;
		case spiral:
			r = (a / 4.0) * theta; break;
		 default: break;
		}
		curvePt[1].x = x0 + r * cos(theta);
		curvePt[1].y = y0 + r * sin(theta);
		lineSegment(curvePt[0],curvePt[1]);

		curvePt[0].x = curvePt[1].x;
		curvePt[0].y = curvePt[1].y;
		theta += dtheta;

	}
}

void displayFcn(void) {
	GLint curveNum;
	glClear(GL_COLOR_BUFFER_BIT);

	cout << "\nEnter the integr value corresponding to \n";
	cout << "one of the folloing curve names .\n";
	cout << "Press any other key to exit. \n";
	cout << "\n1-limacon. 2-cardioid,3-threeLeaf,4-fourLea,5-spira1:";
	cin >> curveNum;

	if (curveNum == 1 || curveNum == 2 || curveNum == 3 || curveNum == 4 || curveNum == 5) {
		drawCurve(curveNum);
	}
	else
	{
		exit(0);
	}
	glFlush();
}

void winReshapFcn(GLint newWidth, GLint newHeight) {
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0.0,(GLdouble) newWidth,0.0,(GLdouble) newHeight);

	glClear(GL_COLOR_BUFFER_BIT);
}
void main(int argc,char ** argv) {

	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE| GLUT_RGB);
	glutInitWindowPosition(100,100);
	glutInitWindowSize(winWidth,winHeight);
	glutCreateWindow("Draw Curves");

	init();
	glutDisplayFunc(displayFcn);
	glutReshapeFunc(winReshapFcn);
	glutMainLoop();
}




猜你喜欢

转载自blog.csdn.net/zhanglixin999/article/details/132790207