Chris Pollett > Old Classes >
CS116a

( Print View )

Student Corner:
  [Grades Sec1]

  [Submit Sec1]

  [Email List Sec1]

  [
Lecture Notes]

Course Info:
  [Texts & Links]
  [Topics]
  [Grading]
  [HW Info]
  [Exam Info]
  [Regrades]
  [Honesty]
  [Announcements]

HW Assignments:
  [Hw1]  [Hw2]  [Hw3]
  [Hw4]  [Hw5]

Practice Exams:
  [Mid1]  [Mid2]  [Final]

                           












HW5 Solutions Page

Return to homework page.

In 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;
}

Return to homework page.