Part of the Khronos Group
OpenGL.org

The Industry's Foundation for High Performance Graphics

from games to virtual reality, mobile phones to supercomputers

Results 1 to 3 of 3

Thread: Drawing Bezier curves using De Casteljau Algorithm

  1. #1
    Junior Member Newbie
    Join Date
    Sep 2011
    Location
    Indiana
    Posts
    1

    Drawing Bezier curves using De Casteljau Algorithm

    I am trying to find the way to generate bezier curve using de casteljau algorithm for one of my assignment here. I am able to generate bezier curve using normal method but unable to start on generating using the above algorithm. It will be of great help if someone can suggest me to right direction or share any piece of code you have. I am not just asking as is. I worked a lot on it and wrote the following code myself to generate the curve.
    I found a web applet which does exactly i needed. ( Demo for De Castaljeau Algorithm). suggest me how to achieve that
    Code :
        #include <iostream>
        using std::cerr;
        using std::endl;
        #include <stdlib.h>
        //using std::exit;
        #include <GL/glut.h> // GLUT stuff, includes OpenGL headers as well 
        #include <windows.h>
        #include <math.h>
        #include <gl/Gl.h>
        #include <gl/Glu.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, z;
            void setxy(float x2, float y2) { x = x2; y = y2; }
            const Point & operator=(const Point &amp;rPoint) {
                 x = rPoint.x;
                 y = rPoint.y;
        		 z = rPoint.z;
     
                 return *this;
              }
     
        };
     
        Point abc[4];
     
        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);
              glVertex3f(p1.x, p1.y, p1.z);
              glVertex3f(p2.x, p2.y, p2.z);
     
            glEnd();
            glFlush();
        }
     
        // Calculate the next bezier point.
        Point drawBezier(Point A, Point B, Point C, Point D, double t) {
            Point P;
     
     
     
     
            P.x = pow((1 - t), 3) * A.x + 3 * t * pow((1 -t), 2) * B.x + 3 * (1-t) * pow(t, 2)* C.x + pow (t, 3)* D.x;
            P.y = pow((1 - t), 3) * A.y + 3 * t * pow((1 -t), 2) * B.y + 3 * (1-t) * pow(t, 2)* C.y + pow (t, 3)* D.y;
        	P.z = pow((1 - t), 3) * A.z + 3 * t * pow((1 -t), 2) * B.z + 3 * (1-t) * pow(t, 2)* C.z + pow (t, 3)* D.z;
     
            return P;
        }
     
        void myMouse(int button, int state, int x, int y) {
          // If left button was clicked
          if(button == GLUT_LEFT_BUTTON &amp;&amp; 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 == 4) {
                glColor3f(1.0,1.0,1.0);
                // Draw two legs of the triangle
                drawLine(abc[0], abc[1]);
                drawLine(abc[1], abc[2]);
        		drawLine(abc[2], abc[3]);
        		//drawLine(abc[3], abc[4]);
                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], abc[3],  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(&amp;argc, argv);
            glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
            glutInitWindowSize(640,480);
            glutInitWindowPosition(100,150);
            glutCreateWindow("Bezier Curve");
     
            glutMouseFunc(myMouse);
            glutDisplayFunc(myDisplay);
     
            myInit();
            glutMainLoop();
     
            return 0;
        }

  2. #2
    Advanced Member Frequent Contributor
    Join Date
    Mar 2009
    Location
    Karachi, Pakistan
    Posts
    810

    Re: Drawing Bezier curves using De Casteljau Algorithm

    DeCasteljau algorithm is a simple recursive application of linear interpolation on hte given control points. Check this: http://www.cubic.org/docs/bezier.htm
    Regards,
    Mobeen

  3. #3
    Advanced Member Frequent Contributor
    Join Date
    Dec 2007
    Location
    Hungary
    Posts
    989

    Re: Drawing Bezier curves using De Casteljau Algorithm

    Again, some homework, huh?
    Disclaimer: This is my personal profile. Whatever I write here is my personal opinion and none of my statements or speculations are anyhow related to my employer and as such should not be treated as accurate or valid and in no case should those be considered to represent the opinions of my employer.
    Technical Blog: http://www.rastergrid.com/blog/

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •