计算机图形学实验--橡皮筋技术(完整代码,准确无误)
计算机图形学--全部实验的实验报告

一、实验目的根据曲线和曲面的基础知识和常用曲线的数学基础,对其算法进行程序设计,验证算法的正确性,并通过程序结果加深对常用曲线数学模型的理解。
二、实验任务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曲线。
实验报告文档

done=TRUE;
}else if((code0.all&code1.all)!=0){
done=TRUE;
}else{
if(code0.all!=0){
x = x0; y = y0;
dx = x1 - x0; dy = y1 - y0;
d = dx - 2 * dy;
UpIncre=2*dx-2*dy;DownIncre=-2*dy;
while(x<=x1)
{
putpixel(x,y);
printf("x = %d , y = %d \n",x,y);
对剩余部分,把它作为新的线段看待,又从头开始考虑。两遍循环之后,就能确定该线段是部分截留下来,还是全部舍弃。
1、分区编码
延长裁剪边框将二维平面分成九个区域,每个区域各用一个四位二进制代码标识。各区代 码值如图中所示。
2、判别
根据C1和C2的具体值,可以有三种情况:
(1)C1=C2=0,表明两端点全在窗口内,因而整个线段也在窗内,应予保留。
(2)C1&C2≠0(两端点代码按位作逻辑乘不为0),即C1和C2至少有某一位同时为1,表明两端点必定处于某一边界的同一外侧,因而整个线段全在窗外,应予舍弃。
(3)不属于上面两种情况,均需要求交点。
3、求交点
假设算法按照:左、右、下、上边界的顺序进行求交处理,对每一个边界求完交点,并相关处理后,算法转向第2步,重新判断,如果需要接着进入下一边界的处理。
实验
类型
设计型
综合型
创新型
√
实
验
目
的
或
要
求
1.实验内容
计算机图形学实验报告

计算机图形学实验报告实验一 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\"文件夹中。
Visual_C++_MFC_绘图

设备中绘图时,需要访问该设备的 DC。MFC 将 GDI 的 DC 封装在 C++类中,包括 CDC 类 和 CDC 派生类,这些类中的许多成员都是对本地 GDI 绘图函数进行简单封装而形成的内联 函数。
DC 的作用就是提供程序与物理设备或者虚拟设备之间的联系,除此之外,DC 还要处
理绘图属性的设置,如文本的颜色等。程序员可以通过调用专门的 GDI 函数修改绘图属性, 如 SetTextColor()函数。
第一个问题是建立什么类型的应用程序,有三个选项:单个文档(Single document)、 多重文档(Multiple document)和基本对话(Dialog based)。单个文档应用程序主窗口中只 有一个窗口,多重文档可以在主窗口中开多个子窗口,基本对话主窗口是一个对话框。例中 选择单个文档,单击“确定”, 如图 3-4 所示 ,进入下一个问题,。
图 3-3 第一个问题:选择应用程序的类型
图 3-4 第二个问题:选择是否要用 ODBC 支持
第三个问题是对 ActiveX 的支持。有五个选项:(1)没有对 ActiveX 的支持;(2)ActiveX 容器,它可以包含链接和嵌入对象。容器不能为其它的 ActiveX 程序提供支持,它只能维护 嵌入对象;(3)微型服务器(Mini-server),应用程序不能独立运行,只能被调用为其它程 序建立 ActiveX 对象。(4)完整服务器(Full-server),它能够独立运行,并能够为其它应用 程序建立 ActiveX 对象。(5)容器和服务器,一个应用程序可以同时是容器和服务器。
3.2.2 绘制基本图形
(1)画点 SetPixel()函数可以在指定的坐标位置按指定的颜色画点。函数原型说明如下:
计算机图形学实验报告

图 2-3 填充线与边界的交点
将填充线与图形边界的交点按照一定顺序排序。根据进出边界的顺序,可以 算出哪些部分是显示的哪些部分是隐藏的。一般的,填充线从基数的交点进入图 形,从偶数的交点离开图形,所以只需要将排好序的交点两两分组,作端点绘制 填充线,如图 2-3 只需绘制点 1 与点 2 之间的部分和点 3 与点 4 之间的填充线。 2.6 多边形区域填充的原理
多边形区域的颜色填充可以使用漫水法填充,针对一行进行区域判断绘点。 其实可以将漫水法理解为特殊的填充线绘制,在漫水法中,填充线的斜率退化为 1,填充线的间隔退化为 0,就是截距只增加 1。
三、程序结果
绘制直线部分没有单独展示,因为在用多边形逼近法绘制椭圆和多边形填充 线绘制会大量使用,只有在直线绘制成功的前提下,才能完成多边形的绘制,在 程序中,不同斜率的直线颜色也会有区别。在这里也没有展示多边形区域的颜色 填充。
在程序中体现为横纵坐标的对换。 F.绘制斜率 m<0 的直线段
通过作 x 轴的对称线段,把斜率小于 0 的直线段转成斜率大于 0 的直线段。 随后按照斜率是否大于 1 继续判断用不用再对直线 y=x 作对称线段。最终转化为 斜率在[0,1]上直线段的绘制。
2.3 绘制圆弧的原理
圆是具有高度对称性的图元,所以可以利用对称性实现画圆算法的简化,现 在可以只考虑第一象限 y>x 的区域的部分。算法每一步都要寻找到离理想圆周最 近 的 点 ( 尽 量 保 证 到 圆 心 的 距 离 是 R ), 所 以 对 每 一 点 来 说 误 差 为 |D(Pi)|=|xi^2+yi^2-R^2|,如下图:
degree += t; xk = longaxis*cos(degree); yk = shortaxis*sin(degree); lineBres(hdc, centra_x + xi, centra_y + yi, centra_x + xk, centra_y + yk); xi = xk; yi = yk; }
计算机图形学实验报告

计算机图形学实验报告
在计算机图形学课程中,实验是不可或缺的一部分。
通过实验,我们可以更好地理解课程中所学的知识,并且在实践中掌握这些
知识。
在本次实验中,我学习了如何使用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,否则结束操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机图形学上机实验报告
橡皮筋技术
计算机科学与技术学院
姓名: 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;
}。