#include<iostream> #include <math.h> //旧版本 固定管线 #include<Windows.h> #include <GL/glut.h> using namespace std; const GLdouble twoPi = 6.283185; struct screenPt { GLint x, y; }; typedef enum{ limacon =1, cardioid, threeLeaf, fourLeaf, spiral} curveName; GLsizei winWidth = 600, winHeight = 500; void init() { //窗口背景为白色 glClearColor(1, 1, 1, 1); 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(theta * 3); break; case fourLeaf: r = a * cos(theta * 2); 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() { GLint curveNum; glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0, 0.0, 1.0); cout << "选择下列任意图形进行绘制 "; cout << "1-limacon, 2-cardioid, 3-threeLeaf, 4-fourLeaf, 5-spiral "; if (curveNum == 1 || curveNum == 2 || curveNum == 3 || curveNum == 4 || curveNum == 5) { drawCurve(curveNum); } else { exit(0); } glFlush(); } void winReshapeFcn(GLint newWidth, GLint newHeight) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, GLdouble(newWidth), 0.0, GLdouble(newHeight)); glClear(GL_COLOR_BUFFER_BIT); winWidth = newWidth; winHeight = newHeight; } int main(int argc, char* argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowPosition(100, 100); glutInitWindowSize(winWidth, winHeight); glutCreateWindow("Curves"); init(); glutDisplayFunc(displayFcn); glutReshapeFunc(winReshapeFcn); glutMainLoop(); system("pause"); return 0; }