Bezier Curves in OpenGL - GeeksforGeeks

30 Jun, 2021
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:
The concept of Bezier curves was discovered by the French engineer Pierre Bé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++
// 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 pointervoid init(void){    glClearColor(1.0, 1.0, 1.0, 1.0);} // Function to draw the Bitmap Textvoid 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 shapesvoid 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 Curvevoid 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 curvevoid 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 Codeint 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:
simmytarika5
c-graphics
computer-graphics
OpenGL
C++
C++ Programs
CPP
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Operator Overloading in C++
Polymorphism in C++
Friend class and function in C++
Sorting a vector in C++
std::string class in C++
Header files in C/C++ and its uses
Program to print ASCII Value of a character
How to return multiple values from a function in C or C++?
C++ Program for QuickSort
Sorting a Map by value in C++ STL