计算机图形学实验--橡皮筋技术(完整代码,准确无误)
- 格式:doc
- 大小:53.50 KB
- 文档页数:7
一、实验目的根据曲线和曲面的基础知识和常用曲线的数学基础,对其算法进行程序设计,验证算法的正确性,并通过程序结果加深对常用曲线数学模型的理解。
二、实验任务1.抛物线程序设计;2.Hermite 曲线程序设计;3.Bezier曲线的算法实现;4.B样条曲线的程序设计三、实验内容和实验步骤任务一:抛物线程序设计实现抛物线算法的C语言程序段如下:(工程名:parabola)Par(int xs,int ys,int xm,int ym,int xe,int ye) //已知起点、中点和终点三个控制点的坐标{double t,dt,ax,ay,bx,by,cx,cy;int n,i;ax=xe-2*xm+xs;ay=ye-2*ym+ys;bx=2.0*(xm-xs);by=2.0*(ym-ys);cx=xs; cy=ys;n=sqrt(ax*ax+ay*ay);n=sqrt(n*100.0);moveto(xs,ys);dt=1.0/n; t=0;for (i=0;i<=n; i++){lineto((int)(ax*t*t+bx*t+cx),(int)( ay*t*t+by*t+cy));t=t+dt;}lineto(xe,ye);}读者可以根据上述抛物线程序设计,写出抛物线参数样条曲线的程序。
任务二:Hermite 曲线程序设计P(t)=FB=TMB=[ t3 t2 t 1 ]程序设计时只考虑二维图形的显示,其代数形式为:x(t)=TMBx , Bx =[ P0x P1x R0x R1x]Ty(t)= TMBy , By =[ P0y P1y R0y R1y]T所以,只要给出Hermite曲线的起点坐标(P0x,P0y),终点坐标(P1x,P1y),以及起点处的切矢量(R0x,R0y)和终点处的切矢量(R1x,R1y),参数变量t在[0,1]的范围内分别取0.01,0.02,…,1,步长为0.01,取100个点,分别求出P(t)=[ x(t),y(t)],在计算机屏幕上显示出每个坐标点,即可绘出Hermite曲线。
计算机图形学实验报告实验一 3D模型的加载、渲染与三维操作学院:专业班级:指导老师:学号:姓名:完成日期:目录一、实验目的 (3)二、使用的工具软件及环境 (3)三、实验内容 (3)四、实验步骤 (3)五、思考 (12)一、实验目的1、掌握在Microsoft Visual Studio环境中使用OpenGL、GLUT 和GLUI;2、了解计算机图形学固定流水线;3、了解OpenGL编程基础;4、掌握三维观察的数学表达和程序实现;5、掌握多边形网格的绘制;二、使用的工具软件及环境Microsoft Visual Studio 2010、OpenGL、Glut、Glui三、实验内容1、在VS 2010中配置OpenGL环境;2、编译简单的GLUT程序;3、编译GLUI源代码,并在调试模式下执行6个示例程序;4、在给定的工程中添加绘制简单几何体的代码;5、在给定的工程中添加读取、绘制三维模型的代码;6、在给定的工程中添加旋转、平移和缩放的控制代码;四、实验步骤1、安装Microsoft Visual Studio软件版本选择:Microsoft Visual Studio 2010以上版本2、VS2010中配置GLUT1)下载GLUT。
Windows环境下的GLUT下载地址:/resources/libraries/glut/glutdlls37be ta.zip2)将下载的压缩包解开,将得到5个文件:glut.h、glut.lib、glut32.lib、glut.dll、glut32.dll。
3)将glut.h放到"%WinDir%\ProgramFiles(x86)\Microsoft SDKs\Windows\v7.0A\Include\gl\"文件夹中。
4)将glut.lib和glut32.lib放到"%WinDir%\ProgramFiles(x86)\Microsoft Visual Studio 10.0\VC\lib\"文件夹中。
计算机图形学实验报告
在计算机图形学课程中,实验是不可或缺的一部分。
通过实验,我们可以更好地理解课程中所学的知识,并且在实践中掌握这些
知识。
在本次实验中,我学习了如何使用OpenGL绘制三维图形,并了解了一些基本的图形变换和视图变换。
首先,我们需要通过OpenGL的基本命令来绘制基本图形,例
如线段、矩形、圆等。
这些基本的绘制命令需要首先设置OpenGL 的状态,例如绘制颜色、线段宽度等,才能正确地绘制出所需的
图形。
然后,在实验中我们学习了图形的变换。
变换是指通过一定的
规则将图形的形状、位置、大小等进行改变。
我们可以通过平移、旋转、缩放等变换来改变图形。
变换需要按照一定的顺序进行,
例如先进行旋转再进行平移等。
在OpenGL中,我们可以通过设
置变换矩阵来完成图形的变换。
变换矩阵包含了平移、旋转、缩
放等信息,通过矩阵乘法可以完成图形的复合变换。
最后,视图变换是指将三维场景中的图形投影到二维平面上,
成为我们所见到的图形。
在实验中,我们学习了透视投影和正交
投影两种方式。
透视投影是指将场景中的图形按照视点不同而产
生不同的远近缩放,使得图形呈现出三维感。
而正交投影则是简单地将场景中的图形按照平行投影的方式呈现在屏幕上。
在OpenGL中,我们可以通过设置视图矩阵和投影矩阵来完成视图变换。
通过本次实验,我对于计算机图形学有了更深入的了解,并掌握了一些基本的图形绘制和变换知识。
在今后的学习中,我将继续学习更高级的图形绘制技术,并应用于实际的项目中。
装订首页
工业学院教案
课程:计算机图形学
学期:2013/14第一学期
课时:理论52,实验12
教材:计算机图形学基础教程
计算机图形学实践教程
教师:孔令德静丽亚
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案
工业学院教案。
计算机图形学基础实验指导书目录实验一直线的生成 ............................................................... -..2.-实验二圆弧及椭圆弧的生成........................................................ -..3 -实验三多边形的区域填充 ......................................................... - (4)-实验四二维几何变换 ............................................................. -..5.-实验五裁剪算法 ................................................................. -..6.-实验六三维图形变换 ............................................................. -..7.-实验七BEZIER 曲线生成......................................................... -..8.-实验八交互式绘图技术实现........................................................ -..10-实验一直线的生成一、实验目的掌握几种直线生成算法的比较,特别是Bresenham 直线生成算法二、实验环境实验设备:计算机实验使用的语言: C 或Visual C++ 、OpenGL三、实验内容用不同的生成算法在屏幕上绘制出直线的图形,对不同的算法可设置不同的线形或颜色表示区别。
四、实验步骤直线Bresenham 生成算法思想如下1)画点(x i, y i), dx=x2-x i, dy=y2-y i,计算误差初值P i=2dy-dx , i=1;2)求直线下一点位置x i+i=x i+i 如果P i>0,贝U y i+i=y i+i,否则y i+i=y i;3)画点(x i+i ,y i+i );4)求下一个误差P i+i 点,如果P i>0,贝U P i+i=P i+2dy-2dx,否则P i+i=P i+2dy;i=i+i ,如果i<dx+i 则转步骤2,否则结束操作。
《计算机图形学》实验指导谢晓玲华东理工大学信息学院计算机系2010年8月目录实验1 OpenGL应用的创建 (2)实验2 橡皮筋技术的实现 (17)实验3 基本变换 (24)实验4 拾取 (41)实验5 三维观察的实现 (54)实验1 OpenGL应用的创建一、实验目的1、了解C++.NET开发基于窗口技术的应用程序的步骤;2、了解OpenGL绘图的步骤;3、显示一个三角形图形。
二、使用的工具软件及环境C++.NET、OpenGL三、实验内容1、构造一个单文档的Windows应用程序2、定义一个填充图案;3、通过菜单,交互控制填充开关;4、显示一个填充的三角形图形。
四、实验指导1、基本要素(1)C++.NET程序设计框架C++.NET提供了一套应用程序框架,应用程序框架是指用于生成一般的应用程序所必须的各种面向对象的软件组建的集合。
C++程序设计的特点之一就是大量使用类库来进行功能扩展。
类库是一个可以在应用程序中使用的相互关联的C++类的集合。
一些类库是随编译器一起提供的,一些是由其他软件公司销售的,还有一些是由用户自己开发的。
应用程序框架是一种类库的超集,它用来定义程序的结构,将其他的类库,例如文档类、视图类及用户自定义类等,嵌入到应用程序框架中,以完成用户预期的功能。
通过定制,C++.NET 可以自动生成一套程序代码,以单文档多视风格的应用程序为例,自动生成的源代码主要包含应用程序类、主框架类、文档类、视口类。
以MyDemo为工程名,C++.NET自动生成的类如下:A.class CMyDemoApp: public CWinAppCMyDemoApp的对象就代表了一个应用程序。
该程序定义了一个单独的全局CMyApp对象theApp:CMyDemoApp theApp;其基类决定了theApp的行为,包括程序的启动、初始化和运行等。
B.class CMainFrame : public CFrameWnd它代表了应用程序的主框架窗口,它负责创建和显示具体的窗口结构,并负责消息的分发。
计算机图形学上机实验报告
橡皮筋技术
计算机科学与技术学院
姓名: xxx
完成日期: 2010-12-7
实验:橡皮筋技术
一、实验目的与要求
实验目的:1.学会使用OpenGL,进一步掌握基本图形的绘制方法,
2.理解glut程序框架
3.理解窗口到视区的变换
4.理解OpenGL实现动画的原理
5.学会基于鼠标和键盘实现交互的实现方法
二、实验内容:
利用OpenGL实现折线和矩形的皮筋绘制技术,并采用右键菜单实现功能的选择
实现方法:1.橡皮筋技术的实现采用双缓存技术,绘制图形时分别绘制到两个缓存,交替显示。
2.右键菜单控制选择绘制折线还是绘制矩形,实现方法:通过菜单注册函数创建一个弹出式菜单,然后使用函数加入菜单项,最后使用函数讲菜单与鼠标右键关联起来,GLUT通过为菜单提供一个整数标识符实现对菜单的管理,在main主函数通过标识符用函数指定对应的菜单为当前的菜单。
2. 折线的橡皮筋绘制技术实现:鼠标所在位置确定一个点,移动鼠标时,每次移动时将点的信息保存在数组中,连接当前鼠标所在点和前一个点的直线段。
3.矩形的橡皮筋绘制技术:每个矩形由两个点唯一确定,鼠标当前点为第一个点,移动鼠标确定第二个点的位置,由这两点的坐标绘制出举行的四条边(直线段),矩形即绘制完毕。
三、实验结果
图鼠标右键菜单
图绘制矩形
四、体会
1> 经过这次实验,逐步对opengl软件有了一定的了解,而且对于理论知识有了很好的巩固,并非仅仅会C语言就能编写画图程序,gult程序有自己特殊的框架与实现过程.在这次试验中,虽然没有完全理解其原理,但在一定程度上已经为我们今后的学习应用打下了基础.
2>初步了解了如何在OpenGL实现基本的绘图功能,以及鼠标和键
盘灯交互设备的实现,还有如何由初始生成元绘制分形物体。
在这个过
程中遇到了很多问题,程序的调试也是困难重重,通过自己看书思考和
老师、同学的帮助最终完成了程序的调试,在这一过程中加深了对理论
知识的理解,以及理清了理论到实践转换的一点点思路,再一次体会到
理论与实践的结合的重要性,今后要多多提高提高动手能力。
五、源程序
橡皮筋技术程序清单:
#include <gl/>
static GLsizei iMode=1;
int winWidth=400,winHeight=300; //窗口的宽度和高度
int num=0,a[100],b[100],w1,h1,w2,h2;
int iPointNum=0,x1,x2,y1,y2;
void Initial(void)
{
glClearColor,,,; //设置窗口背景颜色
}
void ChangeSize(int w,int h)
{
winWidth=w,winHeight=h; //保存当前窗口的大小
glViewport(0,0,w,h); //指定窗口显示区域
glMatrixMode(GL_PROJECTION); //指定设置投影参数
glLoadIdentity(); //调用单位矩阵,去掉以前的投影参数设置 gluOrtho2D,winWidth,,winHeight); //设置投影参数
}
void Display(void)
{
GLint i;
glClear(GL_COLOR_BUFFER_BIT); //用当前背景色填充窗口
glColor3f,,; //指定当前的绘图颜色
if(iMode==1) //绘制折线
{
glBegin(GL_LINE_STRIP);
for(i=0;i<num;i++)
glVertex2i(a[i],b[i]);
glEnd();
glBegin(GL_LINES);
glVertex2i(w1,h1);
glVertex2i(w2,h2);
glEnd();
}
else if(iMode==2)
{ //绘制矩形
glBegin(GL_LINES); //通过给定两点的坐标,绘制矩形的四条边 glVertex2i(x1,y1);
glVertex2i(x2,y1);
glEnd();
glBegin(GL_LINES);
glVertex2i(x1,y1);
glVertex2i(x1,y2);
glEnd();
glBegin(GL_LINES);
glVertex2i(x2,y1);
glVertex2i(x2,y2);
glEnd();
glBegin(GL_LINES);
glVertex2i(x1,y2);
glVertex2i(x2,y2);
glEnd();
}
glutSwapBuffers(); //交换缓冲区
}
void MousePlot(GLint button,GLint action,GLint xMouse,GLint yMouse)
{
if(iMode==1)
{
if(button==GLUT_LEFT_BUTTON&&action==GLUT_DOWN)
{
if(num==0)
{
w1=xMouse;h1=winHeight-yMouse;
a[num]=w1;b[num]=h1;num++;
}
else
{
w2=xMouse;h2=winHeight-yMouse;
a[num]=w2;b[num]=h2;num++;
w1=w2;h1=h2;
glutPostRedisplay();
}
}
if(button==GLUT_RIGHT_BUTTON&&action==GLUT_DOWN)
{
num=0;
glutPostRedisplay();
}
else if(iMode==2)
{
if(button==GLUT_LEFT_BUTTON&&action==GLUT_DOWN)
{
if(iPointNum==0||iPointNum==2)
{
iPointNum=1;
x1=xMouse;y1=winHeight-yMouse; //确定直线段的第一个端点 }
else
{
iPointNum=2; //确定直线段的第一个端点 x2=xMouse;y2=winHeight-yMouse;
glutPostRedisplay();
}
}
if(button==GLUT_RIGHT_BUTTON&&action==GLUT_DOWN)
{
iPointNum=0;
glutPostRedisplay();
}
}
}
void PassiveMouseMove(GLint xMouse,GLint yMouse)
{
if(iMode==1)
{
if(num)
{
w2=xMouse;
h2=winHeight-yMouse;
glutPostRedisplay();
}
}
else if(iMode==2)
{
if(iPointNum==1)
{
x2=xMouse;
y2=winHeight-yMouse;
glutPostRedisplay();
}
}
void ProcessMenu(int value)
{
iMode=value;
glutPostRedisplay();
}
int main(int argc,char* argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowSize(1000,600);
glutInitWindowPosition(100,100);
glutCreateWindow("橡皮筋技术");
glutCreateMenu(ProcessMenu);
glutAddMenuEntry("折线",1);
glutAddMenuEntry("矩形",2);
glutAttachMenu(GLUT_RIGHT_BUTTON);
glutDisplayFunc(Display);
glutReshapeFunc(ChangeSize);
glutMouseFunc(MousePlot);
glutPassiveMotionFunc(PassiveMouseMove);
Initial();
glutMainLoop();
return 0;
}。