CS216
Chris Pollett
Feb 2, 2010
/******************************************************
* Project: CS216 Bezier Test
* File: main.cpp
* Purpose: Code to point plot a simple Bezier Curve
* Start date: Feb. 1, 2010
* Programmer: Chris Pollett
*
* Remarks: Adapted from Hearn and Baker (3rd edition)
*
*******************************************************/
#ifdef WIN32
#include <GL/glut.h>
#endif
#ifdef __APPLE__ //for MAC
/*
I created my project under xcode. I chose new C++ tool as the kind of project.
Then I added the two frameworks:
OpenGL.framework and GLUT.framework. (Frameworks are in /Library/Frameworks)
*/
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#include <GLUT/glut.h>
#endif
#ifdef linux // for linux
/*My compile line was:
g++ -I /usr/X11R6/include -L /usr/X11R6/lib -lglut -lGL \
-lGLU -lX11 -lXmu -lXi -lm name.cpp -o name
*/
#include <GL/glut.h>
#include <GL/glu.h>
#endif
#include <cstdlib>
#include <cmath>
#include <iostream>
using namespace std;
/*
CLASS DEFINITIONS
*/
/*-----------------------------------------------*/
class Point2D
/*
PURPOSE: Encapsulates the notions of a point (x,y) on the screen
*/
{
public:
GLfloat x, y;
};
/*-----------------------------------------------*/
void plotPoint (Point2D p)
/*
PURPOSE: plots a point in 2D
RECEIVES: p the point object to plot
RETURNS: nothing
REMARKS:
*/
{
glBegin(GL_POINTS);
glVertex2f(p.x, p.y);
glEnd();
}
/*-----------------------------------------------*/
void binomialCoefficients(GLint n, GLint *C)
/*
PURPOSE: fills in a reference with binomial coefficient values
RECEIVES: n - says we will compute n choose k for k <= n
C - reference to fill in with these values
RETURNS: nothing
REMARKS:
*/
{
GLint k;
GLint j;
for(k = 0; k <= n; k++)
{
C[k] = 1;
for (j = n; j >= k + 1; j--)
{
C[k] *= j;
}
for (j =n - k ; j >= 2; j--) {
C[k] /= j;
}
}
}
/*-----------------------------------------------*/
void computeBezierCurvePoint(GLfloat u, Point2D *p, GLint nCtrlPts, Point2D *ctrlPts, GLint *C)
/*
PURPOSE: computes a point on the given Bezier Curve
RECEIVES: u - a value between 0, 1 saying when on the curve
p - address of a point to hold the result
nCtrlPts - number of control points in the curve
ctrlPts - reference to the actual control points
C - array storing binomial coefficients.
RETURNS: nothing
REMARKS:
*/
{
GLint k;
GLint n = nCtrlPts - 1;
GLfloat blendingFunction;
p->x = 0.0;
p->y = 0.0;
for (k=0; k < nCtrlPts; k++) {
blendingFunction = C[k] * pow(u, k) * pow(1 - u, n - k);
p->x += ctrlPts[k].x * blendingFunction;
p->y += ctrlPts[k].y * blendingFunction;
}
}
/*
GLUT AND DRIVER CODE
*/
/*-----------------------------------------------*/
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);
}
/*-----------------------------------------------*/
void drawBezier(void)
/*
PURPOSE: GLUT display callback function for this program.
Demo point drawing a Bezier curve
RECEIVES: nothing
RETURNS: nothing
REMARKS:
*/
{
GLint nCtrlPts = 4;
GLint nBezCurvePts = 1000;
Point2D bezierPoint;
Point2D ctrlPts[4] = {{-40.0, -40.0}, {-10.0, 200.0}, {10.0, -200.0}, {40.0, 40.0}};
GLfloat u;
GLint *C, k;
C= new GLint[nCtrlPts];
binomialCoefficients(nCtrlPts - 1, C);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 0.0, 0.0);
//here's where we draw the strings to the screen
for (k =0; k < nBezCurvePts; k++)
{
u = ((GLfloat) k)/ ((GLfloat) nBezCurvePts);
cout << "u = " << u << "\n";
computeBezierCurvePoint( u, &bezierPoint, nCtrlPts, ctrlPts, C);
cout << " pt.x" << bezierPoint.x << " pt.y" << bezierPoint.y << "\n";
plotPoint(bezierPoint);
}
delete [] C;
glFlush();
}
/*-----------------------------------------------*/
void winReshapeFn(int newWidth, int newHeight)
/*
PURPOSE: Resizes/redisplays the contents of the current window
RECEIVES: newWidth, newHeight -- the new dimensions (ignored)
RETURNS: nothing
REMARKS:
*/
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-50, 50, -50, 50);
glClear(GL_COLOR_BUFFER_BIT);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(50, 50);
glutInitWindowSize(500, 500);
glutCreateWindow("An Example OpenGL Program");
init();
glutDisplayFunc(drawBezier);
glutReshapeFunc(winReshapeFn);
glutMainLoop();
return 0;
}
Which of the following statements is true?
| `H_0(0) = 1` | `H_1(0) = 0` | `H_2(0) = 0` | `H_3(0) = 0` |
| `H_0'(0) = 0` | `H_1'(0) = 1` | `H_2'(0) = 0` | `H_3'(0) = 0` |
| `H_0(1) = 0` | `H_1(1) = 0` | `H_2(1) = 0` | `H_3(1) = 1` |
| `H_0'(1) = 0` | `H_1'(1) = 0` | `H_2'(1) = 1` | `H_3'(1) = 0` |