资源简介
本程序主要通过调用OpenGL库中的基础函数实现了Bezier曲线的绘制,绘制原理是利用递推公式求解Bernstein多项式,进而求解出Bezier曲线上对应点的坐标值,然后连接这些点绘制出Bezier曲线。点击左键选择顶点,点击右键结束控制点的输入,并绘制出Beizer曲线,继续点击左键,可以继续添加控制点。
代码片段和文件信息
#include
#include
#include
#include
//定义控制点数目的最大值
#define MAX_CPTX 25
int ncpts=0;//实际控制点个数
static int width=1024height=768;//窗口大小
typedef struct
{
GLfloat xy;
} POINT;
POINT cpts[MAX_CPTX];//存储控制点坐标
//求n!
int JieCheng(int n)
{
if(n==1||n==0)
{
return 1;
}
else
{
return n*JieCheng(n-1);
}
}
//求组合排列
double C(int nint i)
{
return ((double)JieCheng(n))/((double)(JieCheng(i)*JieCheng(n-i)));
}
//求一个数u的num次方
double N(double uint n)
{
double sum=1.0;
if (n==0)
{
return 1;
}
for(int i=0;i {
sum*=u;
}
return sum;
}
//绘制bezier曲线
void drawBezier(POINT *p)
{
void display();
if(ncpts<=0) return;
POINT *p1;
p1=new POINT[1000];
GLfloat u=0xy;
int inum=1;
p1[0]=p[0];
for(u=0;u<=1;u=u+0.001)
{
x=0;
y=0;
for(i=0;i {
x+=C(ncpts-1i)*N(ui)*N((1-u)(ncpts-1-i))*p[i].x;
y+=C(ncpts-1i)*N(ui)*N((1-u)(ncpts-1-i))*p[i].y;
}
p1[num].x=x;
p1[num].y=y;
num++;
}
glPointSize(2.0);
glColor3f(1.00.00.0);
glBegin(GL_LINE_STRIP);
for(int k=0;k<1000;k++)
glVertex2f(p1[k].xp1[k].y);
glEnd();
glFlush();
return;
}
//输入新的控制点
static void mouse(int button int stateint xint y)
{
void display();
float wxwy;
//鼠标未按下左键,不做响应
if(state!=GLUT_DOWN)
return;
else
{if(button==GLUT_LEFT_BUTTON)
{
//转换坐标
wx=(2.0*x)/(float)(width-1)-1.0;
wy=(2.0*(height-1-y))/(float)(height-1)-1.0;
//判断控制点数目是否超过最大值
if(ncpts==MAX_CPTX)
return;
//存储控制点
cpts[ncpts].x=wx;
cpts[ncpts].y=wy;
ncpts++;
//绘制控制点
glColor3f(0.00.00.0);
glPointSize(5.0);
glBegin(GL_POINTS);
glVertex2f(wxwy);
glEnd();
glFlush();
}
if(button==GLUT_RIGHT_BUTTON)
{
display();
drawBezier(cpts);
}
}
}
void display(void)
{
int i;
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.00.00.0);
glPointSize(5.0);
glBegin(GL_POINTS);
for (i = 0; i < ncpts; i++)
glVertex2f(cpts[i].xcpts[i].y);
glEnd();
glFlush();
}
//键盘回调函数
void keyboard(unsigned char keyint xint y)
{
switch (key)
{
case ‘q‘: case ‘Q‘:
exit(0);
break;
case ‘c‘: case ‘C‘:
ncpts = 0;
glutPostRedisplay();
break;
}
}
//重绘函数
void reshape(int wint h)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.01.0-1.01.0-1.01.0);
glMatrixMode(GL_MODELVIEW);
glViewport(00wh);//调整视口
width=w;
height=h;
}
int main(int argc char **argv)
{
//初始化
glutInit(&argcargv);
glutInitDisplayMode(GLUT_RGB);
glutInitWindowSize(widthheight);
glutCreateWindow(“bezier“);
//注册回调函数
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutKeyboardFunc(keyboard);
glutReshapeFunc(reshape);
glClearColor(1.01.01.01.0);
glColor3f(0.00.00.0);
glutMainLoop();
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 3020 2014-03-09 02:38 bezier1\bezier1\bezier1.cpp
文件 3920 2014-03-06 23:46 bezier1\bezier1\bezier1.vcxproj
文件 945 2014-03-06 23:46 bezier1\bezier1\bezier1.vcxproj.filters
文件 143 2014-03-06 22:27 bezier1\bezier1\bezier1.vcxproj.user
文件 406 2014-03-06 23:56 bezier1\bezier1\Debug\bezier1.exe.em
文件 472 2014-03-06 23:56 bezier1\bezier1\Debug\bezier1.exe.em
文件 381 2014-03-08 01:30 bezier1\bezier1\Debug\bezier1.exe.intermediate.manifest
文件 49 2014-03-08 01:30 bezier1\bezier1\Debug\bezier1.lastbuildstate
文件 2051 2014-03-08 01:30 bezier1\bezier1\Debug\bezier1.log
文件 18491 2014-03-08 01:30 bezier1\bezier1\Debug\bezier1.obj
文件 707 2014-03-06 23:46 bezier1\bezier1\Debug\bezier1.vcxprojResolveAssemblyReference.cache
文件 0 2014-03-06 23:46 bezier1\bezier1\Debug\bezier1.write.1.tlog
文件 204 2014-03-06 23:56 bezier1\bezier1\Debug\bezier1_manifest.rc
文件 618 2014-03-08 01:30 bezier1\bezier1\Debug\cl.command.1.tlog
文件 2232 2014-03-08 01:30 bezier1\bezier1\Debug\CL.read.1.tlog
文件 282 2014-03-08 01:30 bezier1\bezier1\Debug\CL.write.1.tlog
文件 2 2014-03-08 01:30 bezier1\bezier1\Debug\li
文件 2 2014-03-08 01:30 bezier1\bezier1\Debug\li
文件 2 2014-03-08 01:30 bezier1\bezier1\Debug\li
文件 2 2014-03-08 01:30 bezier1\bezier1\Debug\li
文件 2 2014-03-08 01:30 bezier1\bezier1\Debug\li
文件 2 2014-03-08 01:30 bezier1\bezier1\Debug\li
文件 2 2014-03-08 01:30 bezier1\bezier1\Debug\li
文件 2 2014-03-08 01:30 bezier1\bezier1\Debug\li
文件 2 2014-03-08 01:30 bezier1\bezier1\Debug\li
文件 2 2014-03-08 01:30 bezier1\bezier1\Debug\li
文件 2 2014-03-08 01:30 bezier1\bezier1\Debug\li
文件 2 2014-03-08 01:30 bezier1\bezier1\Debug\li
文件 2 2014-03-08 01:30 bezier1\bezier1\Debug\li
文件 2 2014-03-08 01:30 bezier1\bezier1\Debug\li
............此处省略35个文件信息
- 上一篇:通信电子线路(第四版)答案
- 下一篇:Spring Boot 参考指南
相关资源
- OpenGL卡通人脸绘制
- 电子科大UESTC_OPENGL三维图形程序设计
- 图形学,利用OpenGL函数进行鼠标、键
- opengl 读取与显示obj文件
- GLFW-3.2.bin.WIN32
- OpenGL实现画球体算法的源码
- OPenGL实现 3DS卫星地球
- 实验一 OpenGL 程序设计基础
- OpenGL Shading Language 橙宝书 源代码 De
- Opengl实现樱花飞舞贴图
- NeHe opengl教程48课全中文pdf,英文pdf,
- opengl实现太阳系动态模型,地球,月
- 计算机图形学 OpenGL实验源码+实验文档
- OpenNI获取三维点云并用OpenGL显示可旋
- glfw-3.2.1源码(需要自行编译)
- 计算机图形学的设计作业。。OpenGl源
- OpenGL绘制3D企鹅
- opengl 实现的机器人行走
- OpenGL 纹理 二重纹理
- Bezier曲面 Coons曲面 B样条曲面绘制(用
- Opengles2.0地球
- 计算机图形学-基于OpenGL的3D迷宫漫游
- 大量Opengl
- Opengl 太阳系
- 用opengl绘制的兔子
- 基于OpenGL的描点绘制Bezier曲线
- opengl天空盒的效果源代码
- Qt5版NeHe OpenGL教程6-10
- 基于opengl下的选择物体局部放大
- OPENGL粒子系统之喷泉
评论
共有 条评论