OpenGL is a cross-language, cross-platform API for rendering 2D and 3D Vector Graphics. It is used to perform a lot of design as well as animation using OpenGL. In this article, we will discuss the concept and implementation of the Bezier Curves OpenGL.
Beizer Curves:
Béziers curves are one of the parametric curves most frequently used in computer graphics and were independently developed for computer-assisted car design by two engineers, both working for French automobile companies: Pierre Bézier, who was an engineer for Renault, and Paul de Casteljau, who was an engineer for Citroën.
- The concept of Bezier curves was discovered by the French engineer Pierre Bézier.
- Bezier curves are basically used in computer graphics to draw shapes, for CSS animation, and in many other places.
- These are the curves that are generated under the control of some other points, also called control points.
Properties of Bezier Curves:
- A very important property of Bezier curves is that they always pass through the first and last control points.
- The degree of the polynomial defining the curve segment is always one less than the number of defining polygon points. So, for example, if we have 4 control points, then the degree of the polynomial is 3, i.e., cubic polynomial.
- In the Bezier curves, moving a control point alters the shape of the whole curve.
- A Bezier curve generally follows the shape of the defining polygon.
- A curve is always inside the convex hull of control points.
Below is the C++ program to implement the Bezier Curves:
// C++ program to implement Bezier Curves #include <GL/gl.h> #include <GL/glu.h> #include <GL/glut.h> #include <stdlib.h> int i;
// Function to initialize the Beizer // curve pointer void init( void )
{ glClearColor(1.0, 1.0, 1.0, 1.0);
} // Function to draw the Bitmap Text void drawBitmapText( char * string, float x,
float y, float z)
{ char * c;
glRasterPos2f(x, y);
// Traverse the string
for (c = string; *c != '\0' ; c++) {
glutBitmapCharacter(
GLUT_BITMAP_TIMES_ROMAN_24, *c);
}
} // Function to draw the shapes void draw(GLfloat ctrlpoints[4][3])
{ glShadeModel(GL_FLAT);
glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4,
&ctrlpoints[0][0]);
glEnable(GL_MAP1_VERTEX_3);
// Fill the color
glColor3f(1.0, 1.0, 1.0);
glBegin(GL_LINE_STRIP);
// Find the coordinates
for (i = 0; i <= 30; i++)
glEvalCoord1f((GLfloat)i / 30.0);
glEnd();
glFlush();
} // Function to display the curved // drawn using the Beizer Curve void display( void )
{ int i;
// Specifying all the control
// points through which the
// curve will pass
GLfloat ctrlpoints[4][3]
= { { -0.00, 2.00, 0.0 },
{ -2.00, 2.00, 0.0 },
{ -2.00, -1.00, 0.0 },
{ -0.00, -1.00, 0.0 } };
draw(ctrlpoints);
GLfloat ctrlpoints2[4][3]
= { { 0.0, -1.00, 0.0 },
{ 0.55, -0.65, 0.0 },
{ 0.65, -0.25, 0.0 },
{ 0.00, 0.70, 0.0 } };
draw(ctrlpoints2);
GLfloat ctrlpoints3[4][3]
= { { 0.0, 0.70, 0.0 },
{ 0.15, 0.70, 0.0 },
{ 0.25, 0.70, 0.0 },
{ 0.65, 0.700, 0.0 } };
draw(ctrlpoints3);
GLfloat ctrlpoints4[4][3]
= { { 0.65, 0.70, 0.0 },
{ 0.65, -0.90, 0.0 },
{ 0.65, -0.70, 0.0 },
{ 0.65, -1.00, 0.0 } };
draw(ctrlpoints4);
GLfloat ctrlpoints5[4][3]
= { { 1.00, -1.00, 0.0 },
{ 1.00, -0.5, 0.0 },
{ 1.00, -0.20, 0.0 },
{ 1.00, 1.35, 0.0 } };
draw(ctrlpoints5);
GLfloat ctrlpoints6[4][3]
= { { 1.00, 1.35 },
{ 1.10, 1.35, 0.0 },
{ 1.10, 1.35, 0.0 },
{ 1.90, 1.35, 0.0 } };
draw(ctrlpoints6);
GLfloat ctrlpoints7[4][3]
= { { 1.00, 0.50, 0.0 },
{ 1.10, 0.5, 0.0 },
{ 1.10, 0.5, 0.0 },
{ 1.90, 0.5, 0.0 } };
draw(ctrlpoints7);
GLfloat ctrlpoints8[4][3]
= { { 3.50, 2.00, 0.0 },
{ 1.50, 2.00, 0.0 },
{ 1.50, -1.00, 0.0 },
{ 3.50, -1.00, 0.0 } };
draw(ctrlpoints8);
GLfloat ctrlpoints9[4][3]
= { { 3.50, -1.00, 0.0 },
{ 4.05, -0.65, 0.0 },
{ 4.15, -0.25, 0.0 },
{ 3.50, 0.70, 0.0 } };
draw(ctrlpoints9);
GLfloat ctrlpoints10[4][3]
= { { 3.50, 0.70, 0.0 },
{ 3.65, 0.70, 0.0 },
{ 3.75, 0.70, 0.0 },
{ 4.15, 0.700, 0.0 } };
draw(ctrlpoints10);
GLfloat ctrlpoints11[4][3]
= { { 4.15, 0.70, 0.0 },
{ 4.15, -0.90, 0.0 },
{ 4.15, -0.70, 0.0 },
{ 4.15, -1.00, 0.0 } };
draw(ctrlpoints11);
GLfloat ctrlpoints12[4][3]
= { { -2.0, 2.50, 0.0 },
{ 2.05, 2.50, 0.0 },
{ 3.15, 2.50, 0.0 },
{ 4.65, 2.50, 0.0 } };
draw(ctrlpoints12);
GLfloat ctrlpoints13[4][3]
= { { -2.0, -1.80, 0.0 },
{ 2.05, -1.80, 0.0 },
{ 3.15, -1.80, 0.0 },
{ 4.65, -1.80, 0.0 } };
draw(ctrlpoints13);
GLfloat ctrlpoints14[4][3]
= { { -2.0, -1.80, 0.0 },
{ -2.0, 1.80, 0.0 },
{ -2.0, 1.90, 0.0 },
{ -2.0, 2.50, 0.0 } };
draw(ctrlpoints14);
GLfloat ctrlpoints15[4][3]
= { { 4.650, -1.80, 0.0 },
{ 4.65, 1.80, 0.0 },
{ 4.65, 1.90, 0.0 },
{ 4.65, 2.50, 0.0 } };
draw(ctrlpoints15);
// Specifying the colour of
// text to be displayed
glColor3f(1, 0, 0);
drawBitmapText( "Bezier Curves "
"Implementation" ,
-1.00, -3.0, 0);
glFlush();
} // Function perform the reshaping // of the curve void reshape( int w, int h)
{ glViewport(0, 0, (GLsizei)w,
(GLsizei)h);
// Matrix mode
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho(-5.0, 5.0, -5.0
* (GLfloat)h / (GLfloat)w,
5.0 * (GLfloat)h / (GLfloat)w, -5.0, 5.0);
else
glOrtho(-5.0 * (GLfloat)w / (GLfloat)h,
5.0 * (GLfloat)w / (GLfloat)h,
-5.0, 5.0,
-5.0, 5.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
} // Driver Code int main( int argc, char ** argv)
{ glutInit(&argc, argv);
glutInitDisplayMode(
GLUT_SINGLE | GLUT_RGB);
// Specifies the window size
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
// Creates the window as
// specified by the user
glutCreateWindow(argv[0]);
init();
// Links display event with the
// display event handler(display)
glutDisplayFunc(display);
glutReshapeFunc(reshape);
// Loops the current event
glutMainLoop();
return 0;
} |
Output: