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