#include "stdafx.h" #include "GL/glut.h" #include "stdlib.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 BsplinePt) { glBegin(GL_POINTS); glVertex2f(BsplinePt.x,BsplinePt.y); glEnd(); } float polyNomial(int k,int d,float u) { if(d==1) { if(u>=float(k)&&u<=float (k+1)) return 1.0; else return 0.0; } else return (u-k)/(d-1)*polyNomial(k,d-1,u)+(k+d-u)/(d-1)*polyNomial(k+1,d-1,u); } void computeBsplinePt(point* BsplinePt,point* CtrlPt,float u,int nCtrlPt,int degree) { int k; float Bkd; BsplinePt->x=0.0; BsplinePt->y=0.0; for(k=0;k<=nCtrlPt-1;k++) { Bkd=polyNomial(k,degree,u); BsplinePt->x+=CtrlPt[k].x*Bkd; BsplinePt->y+=CtrlPt[k].y*Bkd; } } void Bspline(point* CtrlPt,int nCtrlPt,int degree) { float u,du=0.001; point BsplinePt; for(u=degree-1;u<=nCtrlPt;) { computeBsplinePt(&BsplinePt,CtrlPt,u,nCtrlPt,degree); setPixel(BsplinePt); u+=du; } } void render() { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0,0.0,0.0); point CtrlPt[5]={{50.0,50.0},{150.0,300.0},{250.0,150.0},{300.0,350.0},{500.0,50.0}}; int nCtrlPts=5,degree=3; Bspline(CtrlPt,nCtrlPts,degree); glFlush(); } int main(int argc, char* argv[]) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowPosition(50,100); glutInitWindowSize(600,400); glutCreateWindow("B Spline"); init(); glutDisplayFunc(render); glutMainLoop(); return 0; }