2011-10-25 24 views
3

我想要在这里使用de casteljau算法为我的任务之一找到生成贝塞尔曲线的方法。我能够使用常规方法生成贝塞尔曲线,但无法使用上述算法开始生成。如果有人能够建议我正确指导或分享您拥有的任何代码,这将非常有帮助。我不是在问现状。我在它上面做了很多工作,并自己编写了下面的代码来生成曲线。 我发现了一个完全我需要的web小程序。 (http://www2.mat.dtu.dk/people/J.Gravesen/cagd/decast.html)。建议我如何做到这一点在C++中使用De Casteljau算法绘制贝塞尔曲线OpenGL

#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; 
} 
+4

您的曲线生成问题到底是什么?也许你想分享一些特定输入值的输出结果,并将它与applet的结果进行比较? 或者你想要一个类似于applet的GUI? – ksming

回答

4

对我有用,是什么问题?
Image

我不会张贴此作为一个答案,但我不能评论

+0

这不是De Casteljau算法的实现。这是伯恩斯坦多项式的实现。 – anonymous

2

张贴图片以下this link你可以发现一个互动的JavaScript实现。

只要注意点AB如何例如使用((1-t)*A + t*B)计算,看看其他点(BCCDABCBCD最后ABCD)也同样计算。

您可以拖动ABCD和点AB看到建造工程,如何根据参数t