#include
#include
#include
#include
#include
#include
GLsizei winWidth=600,winHeight=600;
GLfloat xwcMin=-50.0,xwcMax=50.0;
GLfloat ywcMin=-50.0,ywcMax=50.0;
class wcPt3D{
public:
GLfloat x,y,z;
};
GLint nCtrlPts=4;
wcPt3D ctrlPts[4]={{-40.0,-40.0,0.0},{-10.0,40.0,0.0},{10.0,-40.0,0.0},{40.0,40.0,0.0}};
GLint changeNo=0;
void init(void)
{
glClearColor(1.0,1.0,1.0,0.0);
}
void plotPoint(wcPt3D pt)
{
glBegin(GL_POINTS);
glVertex2f(pt.x,pt.y);
glEnd();
}
void binomialCoeffs(GLint n,GLint *C)
{
GLint k,j;
for(k=0;k<=n;k++)
{
C[k]=1;
for(j=n;j>=k+1;j--)
{
C[k]*=j;
}
for(j=n-k;j>=2;j--)
{
C[k]/=j;
}
}
}
void computeBezPt(GLfloat u,wcPt3D *bezPt,GLint *C)
{
GLint k,n=nCtrlPts-1;
GLfloat bezBlendFcn;
bezPt->x=bezPt->y=bezPt->z=0.0;
for(k=0;k
{
bezBlendFcn=C[k]*pow(u,k)*pow(1-u,n-k);
bezPt->x+=ctrlPts[k].x * bezBlendFcn;
bezPt->y+=ctrlPts[k].y * bezBlendFcn;
bezPt->z+=ctrlPts[k].y * bezBlendFcn;
}
}
void bezier(GLint nBezCurvePts)
{
wcPt3D bezCurvePt;
GLfloat u;
GLint *C,k;
C=new GLint[nCtrlPts];
binomialCoeffs(nCtrlPts-1,C);
for(k=0;k
{
u=GLfloat(k)/GLfloat(nBezCurvePts);
computeBezPt(u,&bezCurvePt,C);
plotPoint(bezCurvePt);
}
delete [] C;
}
void displayFcn(void)
{
GLint nBezCurvePts=1000;
//wcPt3D ctrlPts[4]={{-40.0,-40.0,0.0},{-10.0,40.0,0.0},{10.0,-40.0,0.0},{40.0,40.0,0.0}};
glClear(GL_COLOR_BUFFER_BIT);
glPointSize(4);
glColor3f(1.0,0.0,0.0);
bezier(nBezCurvePts);
glFlush();
}
void winReshapeFcn(GLint newWidth,GLint newHeight)
{
glViewport(0,0,newWidth,newHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(xwcMin,xwcMax,ywcMin,ywcMax);
glClear(GL_COLOR_BUFFER_BIT);
}
void mousePress(GLint button,GLint state,GLint cx,GLint cy)
{
int i=0;
GLfloat x=GLfloat(cx);
GLfloat y=GLfloat(winHeight-cy);
if(state == GLUT_DOWN && button == GLUT_LEFT_BUTTON)
{
x=x/winWidth*100.0;
x-=50.0;
y=y/winHeight*100.0;
y-=50.0;
//std::cout<<"cx="<
<<" cy="<
<
//std::cout<<"x="<
<<" y="<
<
ctrlPts[changeNo].x=x;
ctrlPts[changeNo].y=y;
changeNo++;
changeNo%=4;
}
displayFcn();
}
int main(int argc,char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(50,50);
glutInitWindowSize(winWidth,winHeight);
glutCreateWindow("Bezier Curve");
init(); //自定义OpenGL初始化函数
glutDisplayFunc(displayFcn); //显示
glutReshapeFunc(winReshapeFcn); //窗口改变
glutMouseFunc(mousePress); //鼠标点击
//glutMotionFunc(mouseMotion); //鼠标移动
//glutKeyboardFunc(keyFunc);
glutMainLoop();
return 0;
}