Home
 
 
Search:  
C C++ Perl PHP Python HTML ShellScripts
 
 
  Coding Books
  Tutorials
  Search Code
  Browse Code
  Link to Us
  Site News
  Contact Metalshell
 
 
 
  Submit Code   Statistics
 



OpenGL SuperBible, Second Edition (2nd Edition)    (ISBN: 1571691642)


 

 List Price: $49.99
 Our Price: $34.99
 Used Price: $23.00

 Release Date: 16 December, 1999
 Manufacturer: Waite Group Pr (Paperback)
 Sales Rank: 17,437

 Author: Richard S. Wright Jr., Michael R. Sweet









More Info

 Bezier Curve 2003-07-03 18:03:40
  cpp 
Category: source:cpp:opengl
Description: Draw a bezier curve using GLUT and OpenGL by defining three points with your mouse.
Platform: all
Author: detour
Viewed: 11245
Rating: 3.9/5 (77 votes)
If you have any questions about this piece of code or still need help, try posting your question on the forum.

 

Printable Version
bezier.cpp
/* bezier.cpp by detour@metalshell.com
 *
 * Create a bezier curve by defining the three points
 * with your mouse.
 *
 * http://www.metalshell.com/
 *
 */

#include <windows.h>
#include <math.h>
#include <gl/Gl.h>
#include <gl/Glu.h>
#include <gl/glut.h>

int SCREEN_HEIGHT = 480;
// Keep track of times clicked, on 3 clicks draw.

int NUMPOINTS = 0;

// Point class to keep it a little cleaner.

class Point {
public:
	float x, y;
	void setxy(float x2, float y2) { x = x2; y = y2; }
	const Point & operator=(const Point &rPoint) {
         x = rPoint.x;
         y = rPoint.y;

         return *this;
      }

};

Point abc[3];

void myInit() {
	glClearColor(0.0,0.0,0.0,0.0);
	glColor3f(1.0,0.0,0.0);
	glPointSize(4.0);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0.0,640.0,0.0,480.0);
	
}

void drawDot(int x, int y) {
	glBegin(GL_POINTS);
	 glVertex2i(x,y);
	glEnd();
	glFlush();
}

void drawLine(Point p1, Point p2) {
	glBegin(GL_LINES);
	  glVertex2f(p1.x, p1.y);
	  glVertex2f(p2.x, p2.y);
	glEnd();
	glFlush();
}

// Calculate the next bezier point.

Point drawBezier(Point A, Point B, Point C, double t) {
	Point P;

	P.x = pow((1 - t), 2) * A.x + 2 * t * (1 -t) * B.x + pow(t, 2) * C.x;
	P.y = pow((1 - t), 2) * A.y + 2 * t * (1 -t) * B.y + pow(t, 2) * C.y;

	return P;
}

void myMouse(int button, int state, int x, int y) {
  // If left button was clicked

  if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
  	// Store where the user clicked, note Y is backwards.

	abc[NUMPOINTS].setxy((float)x,(float)(SCREEN_HEIGHT - y));
	NUMPOINTS++;
		
	// Draw the red  dot.

	drawDot(x, SCREEN_HEIGHT - y);

	// If 3 points are drawn do the curve.

	if(NUMPOINTS == 3) {
		glColor3f(1.0,1.0,1.0);
		// Draw two legs of the triangle

		drawLine(abc[0], abc[1]);
		drawLine(abc[1], abc[2]);
		Point POld = abc[0];
		/* Draw each segment of the curve.  Make t increment in
                   smaller amounts for a more detailed curve. */
		for(double t = 0.0;t <= 1.0; t += 0.1) {
			Point P = drawBezier(abc[0], abc[1], abc[2], t);
			drawLine(POld, P);
			POld = P;
		}
		glColor3f(1.0,0.0,0.0);
		NUMPOINTS = 0;
	}
  }
}

void myDisplay() {
	glClear(GL_COLOR_BUFFER_BIT);
	glFlush();
}

int main(int argc, char *argv[]) {
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
	glutInitWindowSize(640,480);
	glutInitWindowPosition(100,150);
	glutCreateWindow("Bezier Curve");

	glutMouseFunc(myMouse);
	glutDisplayFunc(myDisplay);

	myInit();
	glutMainLoop();

	return 0;
}
Rate this code:
(Not Helpful)  (Very Helpful) 

 
 
   Developer.*  
   Blue Parrots  
   Technipal  
   Defy Magazine  
   Code Project  
   Prog. Heaven  


Got Money?