`
haierboos
  • 浏览: 439205 次
文章分类
社区版块
存档分类
最新评论

【计算机图形学】三、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曲线算法

    计算机图形学 实验 Bezier曲线算法

    计算机图形学 Bezier曲线源代码

    计算机图形学 实验目的: 掌握Bezier曲线的生成算法,掌握应用调和函数生成曲线的方法,掌握3次Bezier曲线的性质。 实验要求: 用鼠标交互输入控制点,绘制控制折线,生成并显示3次Bezier曲线。 实验原理: Bezier...

    计算机图形学Bezier曲线的生成

    本资源是用动画实现计算机图形学里的一个算法Bezier曲线的生成。里面是详细的代码。

    实验三:Bezier曲线.doc

    计算机图形学Bezier曲线生成实验报告含源代码实验结果

    Bezier曲线生成算法(C++实现)

    这是计算机图形学中的Bezier曲线生成算法C++实现,建议在VS2005平台上运行

    图形学Bezier曲线和B样条曲面

    本资源包含了Bezier曲线和B样条曲面的代码实现,非常美观,还带了排版规整的实验报告,源代码基于c,下载即可运行,欢迎交流,请勿抄袭

    【计算机图形学】实验四 Bezier曲线生成 源码

    源博客在(含解压码): ... 实验四 Bezier曲线生成 (1)结合示范代码了解曲线生成原理与算法实现,尤其是Bezier曲线; (2)调试、编译、修改示范程序。 (3)尝试实现B样条曲线算法。

    计算机图形学C++项目,Bezier曲线生成

    资源是以记事本的形式向大家展示源代码,写的时候的环境是Visual Studio2017 计算机图形学的一个实验,新建一个控制台项目,然后源文件用C++,把代码粘贴进去就可以

    Bezier曲线 动画演示

    计算机图形学曲线生成算法Bezier曲线的动画演示,Bezier曲线.swf

    绘制三次 Bezier 曲线1

    河北经贸大学计算机图形学课程设计课题名称:生成三次Bezier曲线学 号: 201672450124 姓 名: 刘振宇 软件开发环境操作系统:windows 1

    计算机图形学(MFC)-Bezier曲面

    资源内容:通过给定的控制点,绘制Bezier曲面 语言:C++ 运行环境:Visual Studio 2013/更高版本

    计算机图形学绘制金刚石实验

    计算机图形学绘制金刚石实验,孔令德版教程配套实验。实验源代码及生成文件

    计算机图形学教程

    计算机图形学教学大纲---实验教程《计算机图形学》实验教学大纲 1 实验一 C程序绘图基础 3 实验二 直线、圆弧及曲线的生成算法 15 实验三 Bezier曲线和样条曲线的生成算法 24 实验四 二维图形的几何变换 33 实验五 ...

    计算机图形学实验(源程序)

    所搜集的这些源程序上包含了计算机图形学几乎所有的基本算法:简单的二维图形的生成二维填充图元的生成二维图形的剪裁二维图形一些基本变换、简单的曲线变换三维图形的变换 、面的消隐、平行投影直线生成、字符显示...

    计算机图形学基础-pdf.zip

    1.1计算机图形学及其相关概念 1.2计算机图形学的发展 1.2.1计算机图形学学科的发展 1.2.2图形硬件设备的发展 1.2.3图形软件的发展 1.3计算机图形学的应用 1.3.1计算机辅助设计与制造 1.3.2计算机辅助...

    上海大学计算机图形学实验(Qt版)

    计算机图形学(基于Qt5.14.0) 通过鼠标交互输入算法所需数据 实现二维基本图元直线段生成的DDA算法,中点算法和Bresenham算法; 实现二维基本图元圆弧生成的中点算法; 实现对线型线宽属性的控制。 实现二维扫描转换...

    利用OpenGL绘制Bezier曲线

    1、利用OpenGL绘制Bezier曲线; 2、使用鼠标在屏幕中任意设置控制点,并生成曲线, 3、使用鼠标和键盘的交互操作实现对曲线的修改;

    计算机图形学教程第二版实验生成“三次贝塞尔曲线”

    计算机图形学教程第二版里面的实验,生成“三次贝塞尔曲线”。C++编译,三次贝塞尔曲线,则需要一个起点,一个终点,两个控制点来控制曲线的形状。

    计算机图形学 程序设计

    实现功能 1. 图元的生成:直线、椭圆、区域填充...2. 样条曲线的生成:Bezier曲线、B-样条曲线的生成 3. 分形图形的生成:Koch曲线、Mandelbrot集 4. 真实感图形的生成 程序是采用C语言编写,没有设计人机交互界面

    计算机图形学实习

    计算机图形学课程实习,比较全面, 画直线、多边形、圆、字符: DDA直线算法、中点直线、Bresenham直线;生成圆的Bresenham算法、生成圆的正负法;Bezier曲线、B样条曲线;多边形;字符。 多边形填充: 种子填充、...

Global site tag (gtag.js) - Google Analytics