1. 算法
2. 源代码
#include "stdafx.h"
#include "GL/glut.h"
#include "stdlib.h"
#include "math.h"
void init()
{
glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,600.0,0.0,400.0);
}
typedef struct point
{
float x,y;
}point;
void setPixel(point bezierPt)
{
glBegin(GL_POINTS);
glVertex2f(bezierPt.x,bezierPt.y);
glEnd();
}
int binomialCoeffs(int k,int n)
{
int i,c=1;
if(k==0)
return c;
else
{
for(i=n-k+1;i<=n;i++)
c*=i;
for(i=1;i<=k;i++)
c/=i;
return c;
}
}
void computeBezierPt(float u,point *bezierPt,point *ctrlPt,int nCtrlPts)
{
int k=0;
float bernstein;
bezierPt->x=0;
bezierPt->y=0;
for(k=0;k<=nCtrlPts-1;k++)
{
bernstein=binomialCoeffs(k,nCtrlPts-1)*pow(u,k)*pow(1-u,nCtrlPts-1-k);
bezierPt->x+=ctrlPt[k].x*bernstein;
bezierPt->y+=ctrlPt[k].y*bernstein;
}
}
void Bezier(point *ctrlPt,int nCtrlPts, int nBezPts)
{
point bezierPt;
float u;
int k;
for(k=0;k<=nBezPts;k++)
{
u=float (k)/float (nBezPts);
computeBezierPt(u,&bezierPt,ctrlPt,nCtrlPts);
setPixel(bezierPt);
}
}
void render()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);
point ctrlPt[4]={{50.0,250.0},{250.0,300.0},{300.0,300.0},{400.0,50.0}};
int nCtrlPts=4, nBezPts=1000;
Bezier(ctrlPt,nCtrlPts,nBezPts);
glFlush();
}
int main(int argc, char* argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(50,100);
glutInitWindowSize(600,400);
glutCreateWindow("Bezier curve");
init();
glutDisplayFunc(render);
glutMainLoop();
return 0;
}
3. 结果