【计算机图形学】三、bezier曲线的生成

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. 结果


【计算机图形学】三、bezier曲线的生成_第1张图片

你可能感兴趣的:(【计算机图形学】三、bezier曲线的生成)