Chris Pollett > Old Classes
> |
HW5 Solutions PageIn the interest of getting up solutions in a timely fashion and since I had a cold for a couple weeks, I am using student solutions for HW4 and HW5. Below is the homework the grader thought was the best: /****************************************************** * Project: CS116A Homework #5 * File: present.cpp * Purpose: Code to draw a 3D box with a present inside * Start date: Nov 27, 2004 * Programmer: Jordan Bien * * *******************************************************/ #include <stdafx.h> #include <glut.h> #include <math.h> using namespace std; const GLfloat PI = 3.14159265358979323846; inline GLfloat toRadians(GLfloat degrees); void winReshapeFn(GLint newWidth, GLint newHeight); GLint winWidth = 600, winHeight = 600; GLdouble boxSize = 30.0, radius = 80.0, viewAngle = 45.0; GLdouble xeye = radius * cos(toRadians(viewAngle)); GLdouble yeye = 40.0; GLdouble zeye = radius * sin(toRadians(viewAngle)); GLdouble xref = 0.0, yref = 0.0, zref = 0.0; GLdouble Vx = 0.0, Vy = 1.0, Vz = 0.0; GLdouble dnear = 1.0, dfar = 200.0; int wireframe = 0; GLdouble color[3] = {1.0, 0.0, 0.0}; /*-----------------------------------------------*/ void keyHandleFn(unsigned char key, int x, int y) /* PURPOSE: Handles keyboard events RECEIVES: key - a key x - screen X position y - screen Y position RETURNS: nothing REMARKS: */ { switch(key) { case ' ': wireframe = !wireframe; break; } glutPostRedisplay(); } /*-----------------------------------------------*/ void specialKeyHandleFn(int key, int x, int y) /* PURPOSE: Handles keyboard events RECEIVES: key - a key x - screen X position y - screen Y position RETURNS: nothing REMARKS: */ { switch(key) { case GLUT_KEY_RIGHT: viewAngle++; break; case GLUT_KEY_LEFT: viewAngle--; break; case GLUT_KEY_DOWN: radius++; break; case GLUT_KEY_UP: if(radius > 1) radius--; break; case GLUT_KEY_PAGE_UP: boxSize++; break; case GLUT_KEY_PAGE_DOWN: if(boxSize > 1) boxSize--; break; } xeye = radius * cos(toRadians(viewAngle)); zeye = radius * sin(toRadians(viewAngle)); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(xeye, yeye, zeye, xref, yref, zref, Vx, Vy, Vz); glutPostRedisplay(); } /*-----------------------------------------------*/ inline GLfloat toRadians(GLfloat degrees) /* PURPOSE: converts an angle in degrees to radians RECEIVES: degrees -- the angle to convert RETURNS: the equivalent value in radians REMARKS: inlined so don't have stack overhead in doing this small call */ { return degrees * (PI / 180); } /*-----------------------------------------------*/ void checkColor(GLdouble* pt) /* PURPOSE: sets the depth-color of a vertex and plots it RECEIVES: pt - the coordinates of the vertex RETURNS: none REMARKS: calculates the intensity of the color by checking its distance to the viewer */ { GLdouble intensity = 1.0; intensity = (1 - sqrt( ((xeye - pt[0]) * (xeye - pt[0])) + ((zeye - pt[2]) * (zeye - pt[2])) ) / (dfar * .7)) * 1.3; glColor3f(color[0] * intensity, color[1] * intensity, color[2] * intensity); glVertex3dv(pt); glColor3f(color[0], color[1], color[2]); } /*-----------------------------------------------*/ void displayBox() /* PURPOSE: subroutine for displaying the box RECEIVES: none RETURNS: none REMARKS: none */ { GLdouble third = (2 * boxSize) / 3; GLdouble p1[] = {-boxSize, boxSize, boxSize}; GLdouble p2[] = {boxSize, boxSize, boxSize}; GLdouble p3[] = {-boxSize, -boxSize, boxSize}; GLdouble p4[] = {boxSize, -boxSize, boxSize}; GLdouble p5[] = {-boxSize, boxSize, -boxSize}; GLdouble p6[] = {boxSize, boxSize, -boxSize}; GLdouble p7[] = {-boxSize, -boxSize, -boxSize}; GLdouble p8[] = {boxSize, -boxSize, -boxSize}; GLdouble r1[] = {-boxSize + third, boxSize, boxSize}; GLdouble r2[] = {boxSize - third, boxSize, boxSize}; GLdouble r3[] = {-boxSize + third, -boxSize, boxSize}; GLdouble r4[] = {boxSize - third, -boxSize, boxSize}; GLdouble r5[] = {-boxSize + third, boxSize, -boxSize}; GLdouble r6[] = {boxSize - third, boxSize, -boxSize}; GLdouble r7[] = {-boxSize + third, -boxSize, -boxSize}; GLdouble r8[] = {boxSize - third, -boxSize, -boxSize}; GLdouble s1[] = {-boxSize, boxSize, boxSize - third}; GLdouble s2[] = {boxSize, boxSize, boxSize - third}; GLdouble s3[] = {-boxSize, -boxSize, boxSize - third}; GLdouble s4[] = {boxSize, -boxSize, boxSize - third}; GLdouble s5[] = {-boxSize, boxSize, -boxSize + third}; GLdouble s6[] = {boxSize, boxSize, -boxSize + third}; GLdouble s7[] = {-boxSize, -boxSize, -boxSize + third}; GLdouble s8[] = {boxSize, -boxSize, -boxSize + third}; GLdouble t1[] = {boxSize - third, boxSize, boxSize - third}; GLdouble t2[] = {-boxSize + third, boxSize, boxSize - third}; GLdouble t3[] = {-boxSize + third, boxSize, -boxSize + third}; GLdouble t4[] = {boxSize - third, boxSize, -boxSize + third}; GLdouble b1[] = {boxSize - third, -boxSize, boxSize - third}; GLdouble b2[] = {-boxSize + third, -boxSize, boxSize - third}; GLdouble b3[] = {-boxSize + third, -boxSize, -boxSize + third}; GLdouble b4[] = {boxSize - third, -boxSize, -boxSize + third}; glBegin(GL_QUADS); glColor3f(1.0, 0.0, 0.0); color[0] = 1.0; color[1] = 0.0; color[2] = 0.0; //sides of red box checkColor(p1); checkColor(p3); checkColor(r3); checkColor(r1); checkColor(r2); checkColor(r4); checkColor(p4); checkColor(p2); checkColor(p2); checkColor(p4); checkColor(s4); checkColor(s2); checkColor(s8); checkColor(s6); checkColor(p6); checkColor(p8); checkColor(p5); checkColor(p7); checkColor(r7); checkColor(r5); checkColor(r8); checkColor(r6); checkColor(p6); checkColor(p8); checkColor(p1); checkColor(p3); checkColor(s3); checkColor(s1); checkColor(s7); checkColor(s5); checkColor(p5); checkColor(p7); //top of red box checkColor(p1); checkColor(r1); checkColor(t2); checkColor(s1); checkColor(p2); checkColor(r2); checkColor(t1); checkColor(s2); checkColor(p5); checkColor(r5); checkColor(t3); checkColor(s5); checkColor(p6); checkColor(r6); checkColor(t4); checkColor(s6); //bottom of red box checkColor(p3); checkColor(r3); checkColor(b2); checkColor(s3); checkColor(p4); checkColor(r4); checkColor(b1); checkColor(s4); checkColor(p7); checkColor(r7); checkColor(b3); checkColor(s7); checkColor(p8); checkColor(r8); checkColor(b4); checkColor(s8); //1st blue ribbon glColor3f(0.0, 0.0, 1.0); color[0] = 0.0; color[1] = 0.0; color[2] = 1.0; checkColor(r1); checkColor(r3); checkColor(r4); checkColor(r2); checkColor(r1); checkColor(r2); checkColor(r6); checkColor(r5); checkColor(r5); checkColor(r6); checkColor(r8); checkColor(r7); checkColor(r3); checkColor(r4); checkColor(r8); checkColor(r7); //2nd blue ribbon checkColor(s1); checkColor(s5); checkColor(s7); checkColor(s3); checkColor(s1); checkColor(s5); checkColor(t3); checkColor(t2); checkColor(s2); checkColor(s6); checkColor(t4); checkColor(t1); checkColor(s2); checkColor(s4); checkColor(s8); checkColor(s6); checkColor(s3); checkColor(s7); checkColor(b3); checkColor(b2); checkColor(s4); checkColor(s8); checkColor(b4); checkColor(b1); glEnd(); } /*-----------------------------------------------*/ void displayTriforce() /* PURPOSE: subroutine for displaying the triforce RECEIVES: none RETURNS: none REMARKS: none */ { GLdouble t1[] = {0, 20, 5}; GLdouble t2[] = {-10, 0, 5}; GLdouble t3[] = {10, 0, 5}; GLdouble t4[] = {-20, -20, 5}; GLdouble t5[] = {0, -20, 5}; GLdouble t6[] = {20, -20, 5}; GLdouble t7[] = {0, 20, -5}; GLdouble t8[] = {-10, 0, -5}; GLdouble t9[] = {10, 0, -5}; GLdouble t10[] = {-20, -20, -5}; GLdouble t11[] = {0, -20, -5}; GLdouble t12[] = {20, -20, -5}; glColor3f(1.0, 1.0, 0.0); color[0] = 1.0; color[1] = 1.0; color[2] = 0.0; glBegin(GL_TRIANGLES); checkColor(t1); checkColor(t2); checkColor(t3); checkColor(t2); checkColor(t4); checkColor(t5); checkColor(t3); checkColor(t5); checkColor(t6); checkColor(t7); checkColor(t8); checkColor(t9); checkColor(t8); checkColor(t10); checkColor(t11); checkColor(t9); checkColor(t11); checkColor(t12); glEnd(); glBegin(GL_QUADS); checkColor(t1); checkColor(t2); checkColor(t8); checkColor(t7); checkColor(t1); checkColor(t3); checkColor(t9); checkColor(t7); checkColor(t2); checkColor(t3); checkColor(t9); checkColor(t8); checkColor(t2); checkColor(t4); checkColor(t10); checkColor(t8); checkColor(t2); checkColor(t5); checkColor(t11); checkColor(t8); checkColor(t4); checkColor(t5); checkColor(t11); checkColor(t10); checkColor(t3); checkColor(t5); checkColor(t11); checkColor(t9); checkColor(t3); checkColor(t6); checkColor(t12); checkColor(t9); checkColor(t5); checkColor(t6); checkColor(t12); checkColor(t11); glEnd(); } /*-----------------------------------------------*/ void drawPresent(void) /* PURPOSE: draws the box and present in filled polygons or wireframe RECEIVES: nothing RETURNS: nothing REMARKS: Side-effect is to draw a box and present, clipping the present if necessary. */ { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); GLdouble clipPlane0[] = {-1.0, 0.0, 0.0, boxSize + 1.0}; GLdouble clipPlane1[] = {1.0, 0.0, 0.0, boxSize + 1.0}; GLdouble clipPlane2[] = {0.0, -1.0, 0.0, boxSize + 1.0}; GLdouble clipPlane3[] = {0.0, 1.0, 0.0, boxSize + 1.0}; GLdouble clipPlane4[] = {0.0, 0.0, -1.0, boxSize + 1.0}; GLdouble clipPlane5[] = {0.0, 0.0, 1.0, boxSize + 1.0}; glClipPlane(GL_CLIP_PLANE0, clipPlane0); glClipPlane(GL_CLIP_PLANE1, clipPlane1); glClipPlane(GL_CLIP_PLANE2, clipPlane2); glClipPlane(GL_CLIP_PLANE3, clipPlane3); glClipPlane(GL_CLIP_PLANE4, clipPlane4); glClipPlane(GL_CLIP_PLANE5, clipPlane5); glEnable(GL_CLIP_PLANE0); glEnable(GL_CLIP_PLANE1); glEnable(GL_CLIP_PLANE2); glEnable(GL_CLIP_PLANE3); glEnable(GL_CLIP_PLANE4); glEnable(GL_CLIP_PLANE5); glEnable(GL_DEPTH_TEST); if(wireframe) { glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); } else { glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); } displayTriforce(); displayBox(); glFlush(); } /*-----------------------------------------------*/ void winReshapeFn(GLint newWidth, GLint newHeight) /* PURPOSE: Resizes/redisplays the contents of the current window RECEIVES: newWidth, newHeight -- the new dimensions RETURNS: nothing REMARKS: Notice resize viewport */ { winWidth = newWidth; winHeight = newHeight; glViewport(0, 0, newWidth, newHeight); drawPresent(); } /*-----------------------------------------------*/ void init(void) /* PURPOSE: Used to initializes our OpenGL window RECEIVES: Nothing RETURNS: Nothing REMARKS: Nothing */ { glClearColor(1.0, 1.0, 1.0, 0.0); glMatrixMode(GL_MODELVIEW); gluLookAt(xeye, yeye, zeye, xref, yref, zref, Vx, Vy, Vz); glMatrixMode(GL_PROJECTION); gluPerspective(90, 1, dnear, dfar); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowPosition(50, 50); glutInitWindowSize(winWidth, winHeight); glutCreateWindow("Present"); init(); //Set up drawing callbacks glutDisplayFunc(drawPresent); glutReshapeFunc(winReshapeFn); //Set up keyboard handlers glutKeyboardFunc(keyHandleFn); glutSpecialFunc(specialKeyHandleFn); //Start main loop glutMainLoop(); return 0; } |