简体   繁体   English

使用C ++,OpenGL中的De Casteljau算法绘制Bezier曲线

[英]Drawing Bezier curves using De Casteljau Algorithm in C++ , OpenGL

I am trying to find the way to generate bezier curve using de casteljau algorithm for one of my assignment here. 我正试图找到使用de casteljau算法生成贝塞尔曲线的方法,用于我的一项任务。 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. 我找到了一个确实需要的网络小程序。 (http://www2.mat.dtu.dk/people/J.Gravesen/cagd/decast.html). (http://www2.mat.dtu.dk/people/J.Gravesen/cagd/decast.html)。 suggest me how to achieve that 建议我如何实现这一目标

#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 &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 && 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(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(100,150);
    glutCreateWindow("Bezier Curve");

    glutMouseFunc(myMouse);
    glutDisplayFunc(myDisplay);

    myInit();
    glutMainLoop();

    return 0;
}

works for me, what is the problem? 对我有用,有什么问题?
图片

I wouldn't post this as an answer, but I can't post an image in a comment 我不会将此作为答案发布,但我无法在评论中发布图片

Following this link you can find an interactive javascript implementation. 通过此链接,您可以找到交互式JavaScript实现。

在此输入图像描述

Just note how point AB is for example computed using ((1-t)*A + t*B) and see how other points ( BC , CD , ABC , BCD and finally ABCD ) are similarly computed. 只需注意点AB是如何使用((1-t)*A + t*B)并且看看如何类似地计算其他点( BCCDABCBCD和最后的ABCD )。

You can drag A , B , C and D and the point AB to see how the construction works depending on the parameter t . 您可以拖动ABCD以及AB点,以根据参数t查看结构的工作原理。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM