![]() |
|
|
Home | | Syllabus | |
Assignments | |
Documentation
Solution to Assignment 4, Problem 1c
/*
CSCI 384 Assignment 4.
Problem 1c: Approximation to a cylinder.
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <GL/glut.h>
#define PI 3.14159
typedef GLfloat point3[3];
GLfloat spin[3] = {0.0, 0.0, 0.0};
void myinit(void)
{
glClearColor(1.0, 1.0, 1.0, 1.0);
glColor3f(1.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-250, 250, -250, 250, -250, 250); /*Note, not ortho2D*/
glMatrixMode(GL_MODELVIEW);
}
/*Set length of vector to 50*sqrt(2) */
void normalize(GLfloat *verts){
int i;
GLfloat normalFactor;
normalFactor = sqrt(verts[0]*verts[0] + verts[2]*verts[2]);
verts[0] = 50.0 * sqrt(2.0)*verts[0]/normalFactor;
verts[2] = 50.0 * sqrt(2.0)*verts[2]/normalFactor;
}
/*Draw Quad faces*/
void rectangleFace(point3 p1, point3 p2, point3 p3, point3 p4){
/*Draw the quadrilateral*/
glBegin(GL_QUADS);
glVertex3fv(p1);
glVertex3fv(p2);
glVertex3fv(p3);
glVertex3fv(p4);
glEnd();
}
/*Recursively divide trangular faces to approximate cylinder*/
void divideQuad(point3 a, point3 b, point3 c, point3 d, int m){
point3 midpoint1, midpoint2;
if (m > 0) {
/*Calculate midpoint of top and bottom edges of quad*/
midpoint1[0] = (a[0] + b[0])/2.0;
midpoint1[1] = (a[1] + b[1])/2.0;
midpoint1[2] = (a[2] + b[2])/2.0;
midpoint2[0] = (c[0] + d[0])/2.0;
midpoint2[1] = (c[1] + d[1])/2.0;
midpoint2[2] = (c[2] + d[2])/2.0;
/*Move those points to distance of 50.0*sqrt(2.0) from the center*/
normalize(midpoint2);
normalize(midpoint1);
/*Divide up the new quadralateral faces generated*/
glColor3f(1.0, 0.0, 0.0);
divideQuad(a, midpoint1, midpoint2, d, m-1);
glColor3f(0.0, 0.0, 1.0);
divideQuad(midpoint1, b, c, midpoint2, m-1);
} else {
/*We're done with recursion, draw rectangle*/
rectangleFace(a, b, c, d);
}
}
void display(void){
/*Note 3D points here. Set up array of 3D vertices*/
point3 vertices[8] = { {-50.0, 50.0, 50.0}, {-50.0, 50.0, -50.0}, {50.0, 50.0, -50.0}, {50.0, 50.0, 50.0},
{-50.0, -50.0, 50.0}, {-50.0, -50.0, -50.0}, {50.0, -50.0, -50.0}, {50.0, -50.0, 50.0} };
int i;
int m = 1;
/*Make sure all vertices are equidistant from origin*/
for(i = 0; i < 8; i++){
normalize(vertices[i]);
}
/*Note use of Depth buffer bit for hidden surface removal*/
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glRotatef(spin[0], 1.0, 0.0, 0.0); /*Rotate box*/
glRotatef(spin[1], 0.0, 1.0, 0.0);
glRotatef(spin[2], 0.0, 0.0, 1.0);
/*Start dividing the faces*/
glColor3f(1, 0, 0);
divideQuad(vertices[0], vertices[1], vertices[5], vertices[4], m);
glColor3f(0, 0, 1);
divideQuad(vertices[1], vertices[2], vertices[6], vertices[5], m);
glColor3f(1, 0, 0);
divideQuad(vertices[2], vertices[3], vertices[7], vertices[6], m);
glColor3f(0, 0, 1);
divideQuad(vertices[3], vertices[0], vertices[4], vertices[7], m);
glFlush();
glutSwapBuffers(); /*Display next buffer*/
}
/*User interface for spinning the cylinder*/
void keys(unsigned char key, int x, int y){
int axis;
if(key == 'f') {
axis = 0;
spin[axis] += 2.0;
if (spin[axis] > 360.0)
spin[axis] = spin[axis] - 360.0;
}
else if(key == 'j'){
axis = 1;
spin[axis] += 2.0;
if (spin[axis] > 360.0)
spin[axis] = spin[axis] - 360.0;
}
else if(key == 'k'){
axis = 2;
spin[axis] += 2.0;
if (spin[axis] > 360.0)
spin[axis] = spin[axis] - 360.0;
}
glutPostRedisplay();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
/*Note the GLUT_DOUBLE and GLUT_DEPTH here*/
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
myinit();
glutInitWindowSize(500,500);
glutInitWindowPosition(50,50);
glutCreateWindow("Spinning Quads");
glutDisplayFunc(display);
glutKeyboardFunc(keys);
glEnable(GL_DEPTH_TEST); /*For hidden surface removal*/
myinit();
glutMainLoop();
return 0;
}
Home | | Syllabus | | Assignments | | Documentation
Constance Royden--croyden@mathcs.holycross.edu
|