第一篇:计算机图形学 实验六-西南交大
学号:姓名:班级:
计算机图形学
实验报告
2016年6月日
实验名称:三维交互式图形程序设计
一、实验目的:
1)掌握真实感图形生成的基本原理,如消隐、光照、材质等知识; 2)学习使用OpenGL、GLUT等生成基本图形,如球体、正方体、茶壶等;
3)学习使用OpenGL生成各种光源:点光源、平行光、聚光灯等; 4)学习使用OpenGL设置绘制对象的颜色、材质;
5)进一步熟悉OpenGL图形变换技术:几何变换、视图变换、观察变换等:
(1)对模型实现各种几何变换(测试代码保留在程序中),包括对 glLoadMatrix、glMultMatrix、glTranslate、glRotate、glScale 等的使用;
(2)视口变换,测试不同大小的视口 glViewport ;
(3)投影变换,要对对平行投影与透视投影分别测试,使用不同的观察体参数,观察效果
二、实验任务:
1)使用MFC AppWizard 建立一个SDI 程序,根据参考资料2 和3 中的步骤设置OpenGL 图形绘制环境。增加绘制如下表图形(选择其中任意一个,注意模型坐标系的选择和顶点坐标的计算)、球体或茶壶等(使用glut 函数)。环境中创建点光源、平行光、聚光灯(可利用对话框输入参数创建)、设置所绘制对象的材质,呈现出塑料、金属等材质特性。对光源的位置、方向、类型进行控制,改变材质参数,观察效果(测试代码保留在程序中);
三.实验过程: 1.观察参数的设置
glViewport(0.0, 0.0, width, height)//视口大小设置 gluLookAt(0,0,10,0,0,0,0,1,0);//观察点设置,参数分别为观察点位置,向哪点(何处)观察,上方向的定义 2.投影变换
glOrtho(-15.0*aspect, 15.0*aspect,-15.0,15.0,1,100);//平行投影,参数是投影面大小和投影的物体距离范围
gluPerspective(45,aspect, 1, 100.0);//透视投影,参数为视角,长宽比,投影距离范围 3.几何变换
glLoadMatrixf(a);//设置当前矩阵为a glTranslatef(2,0,0);//当前矩阵*偏移矩阵 glRotatef(45, 0.0, 0.0, 0.0);//旋转
glScalef(m_scalX,m_scalY,m_scalZ);//当前矩阵*比例矩阵 4.光源参数的设置
glLightfv(GL_LIGHT0, Type, vlight);//light为float数组 glLightf(GL_LIGHT0, Type, light);//light为float Type=GL_LIGHT0, GL_AMBIENT //环境光 Type=GL_LIGHT0, GL_DIFFUSE
//漫反射 Type=GL_LIGHT0, GL_SPECULAR //镜面光 Type=GL_POSITION
//光源位置 Type=GL_CONSTANT_ATTENUATION //常数衰减因 Type=GL_LINEAR_ATTENUATION //线性衰减因子 Type=GL_QUADRATIC_ATTENUATION //二次衰减因子 Type=GL_SPOT_DIRECTION
//聚光方向矢量 Type=GL_SPOT_EXPONENT
//聚光指数 Type=GL_SPOT_CUTOFF
//聚光截止角 光源类型控制
平行光源::设置AMBIENT,DIFFUSE,SPECULAR,GL_POSITION4个参数。其中GL_POSITION第4个参数为0,表示距离无限远
点光源:平行光源基础上添加常数衰减,因线性衰减因子,二次衰减因,其中GL_POSITION第4个参数为1 表示光源位置为确切位置,聚光灯光源 :在点光源基础上添加聚光方向矢量,聚光截止角,聚光指数
本实验使用了3个光源,分别作为平行光源,点光源和聚光灯光源,通过不同菜单选择在输入参数的同时启用不同的光源,以达到光源控制的效果
四.实验结果
原图:
材质选择:
光源基本参数设置
设置聚光灯光源(位置,方向,聚光指数,聚光截止角,衰减因子)
聚光衰减属性(聚光灯)
五.实验体会
通过此次实验,基本掌握了真实图形生成的基本原理,对于3D图新的材质变换,光源变换等有了更深层次的理解。初步学习并掌握了几何变换、视图变换、观察变换等。对于对话框、组建的设置更是理解的透彻。深入掌握了课堂上的些许知识。但对于之后的图形学设计,还是有很多的不足之处。所以,需要继续努力,掌握更多的图形设计学习。
第二篇:计算机图形学实验
实验三 MFC画直线
最近自己在学习如何在VC 6.0 开发环境下的使用MFC AppWizard(exe)来绘画一条直线,虽然比较简单,通过这样的练习可以帮助你熟悉MFC的开发环境以及其中的消息传递机制,希望对于像我一样初入MFC图形绘制学习的人有帮
助
第一步:构建MFC窗体
打开Visual C++ 6.0编译器 新建→工程→MFC AppWizard(exe),工程名以DrawLine为例,然后确定。为了方便,在MFC应用程序向导—步骤1当中选择“单文档”,其余所有的步骤都为默认值,直接“完成”。这样一个简单的MFC窗体就构建好了,自己不妨Compile—Build—BuildExecute一下。
第二步:编辑菜单项
选择ResourceView视窗展开Menu文件夹,左键双击IDR_DRAWLITYPE,右边就会出现菜单图形编辑界面,为了简化,我们只在添加帮助→DrawLine功能选择项。双击空白会弹出“菜单项目 属性”对话框。ID:ID_DRAW_LINE;标明:
DrawLine(&D),其它的为缺省。
第三步:建立消息命令
如果此时运行该程序,你会发现帮助—DrawLine的功能选项是灰色的,原因就在于我们还没有添加该功能的消息命令相应函数。通过“查看—Message Maps—Project:DrawLine—Class name:CDrawLineView—Object IDs:ID_DRAW_LINE—选定COMMAND—Add Function„”,其它为默认,最后确定完成。现在如果再重新运行该程序的话,会发现原来的灰色已经消除了。
第四步:添加鼠标消息响应
打开ClassView视窗,右键选定CDrawLineView,选择Add Windows Messsage Handler会弹出对话框,完成CDrawLineView类的WM_LBUTTONDOWN、WM_MOUSEMOVE、WM_LBUTTONUP三个Windows消息事件的新建。
第五步:添加响应代码
首先,在ClassView视窗中双击CDrawLineView会定位到“DrawLineView.h : interface of the CDrawLineView class”的文件,添加CDrawLineView类的成员:protected: int m_Drag;POINT m_pPrev;POINT m_pOrigin;三个成员变量。视窗中展开CDrawLineView类,双击定位OnLBUTTONDOWN()函数。在该函数消息响应
处添加如下代码:
//建立好绘图的设备环境
CClientDC dc(this);OnPrepareDC(&dc);
dc.DPtoLP(&point);
//获取起始点坐标 m_pPrev=point;m_pOrigin=point;
m_Drag=1;
然后,定位于OnMouseMove(),添加如下代码(其中关键用到了橡皮筋技术):
//建立好绘图的设备环境
CClientDC dc(this);
OnPrepareDC(&dc);dc.DPtoLP(&point);
dc.SetROP2(R2_NOT);//橡皮筋绘图技术
//判断是否BUTTONDOWN
if(m_Drag)
{
dc.MoveTo(m_pOrigin);dc.LineTo(m_pPrev);dc.MoveTo(m_pOrigin);dc.LineTo(point);
}
m_pPrev=point;
最后,在OnLBUTTONDOWN()添加代码: m_Drag=0;
程序运行效果图
实验4 实现圆的生成算法
一、实验目的
1.熟悉CDC图形程序库; 2.掌握中点画圆生成算法; 3.掌握Bresenham画圆算法。
二、实验内容
利用VisualC++6.0设计一个简易画圆绘图板,验证圆生成算法。
三、实验指导
1.生成绘图应用程序的框架,如下图所示。具体实现见第二次实验,过程不再详细说明。
2.在应用程序中增加菜单
完成相关菜单的设计,具体的效果如下图所示,并设置好相关菜单消息的映射,具体的实现在前面的实验中介绍过,再此不在详细说明。
3.在绘图函数中添加代码
通过以上步骤,得到了与菜单对应的消息映射,就可以在函数中添加代码绘制图形了。(1)利用中点画圆算法实现圆的生成(算法原理见教材)。void CDraw_CirView::OnMid(){ // TODO: Add your command handler code here CDC*pDC=GetDC();//得到绘图类指针
RedrawWindow();//重绘窗口
int x,y,x0=200,y0=200,r=100;//圆的圆心为(x0,y0),半径为r float d;x=0;y=r;d=1.25-r;
pDC->SetPixel(x+x0,y+y0,RGB(255,0,0));pDC->SetPixel(y+x0,x+y0,RGB(255,0,0));pDC->SetPixel(y+x0,-x+y0,RGB(255,0,0));pDC->SetPixel(x+x0,-y+y0,RGB(255,0,0));pDC->SetPixel(-x+x0,-y+y0,RGB(255,0,0));pDC->SetPixel(-y+x0,-x+y0,RGB(255,0,0));pDC->SetPixel(-y+x0,x+y0,RGB(255,0,0));pDC->SetPixel(-x+x0,y+y0,RGB(255,0,0));while(x<=y){
if(d<0)
{
d=d+2*x+3;
x++;
}
else
{
d=d+2*(x-y)+5;
x++;
y--;}
pDC->SetPixel(x+x0,y+y0,RGB(255,0,0));
pDC->SetPixel(y+x0,x+y0,RGB(255,0,0));
pDC->SetPixel(y+x0,-x+y0,RGB(255,0,0));
pDC->SetPixel(x+x0,-y+y0,RGB(255,0,0));
pDC->SetPixel(-x+x0,-y+y0,RGB(255,0,0));
pDC->SetPixel(-y+x0,-x+y0,RGB(255,0,0));
pDC->SetPixel(-y+x0,x+y0,RGB(255,0,0));
pDC->SetPixel(-x+x0,y+y0,RGB(255,0,0));} } 由以上代码绘出的图形如下:
(2)利用Bresenham算法生成圆(算法原理见教材)。void CDraw_CirView::OnBre(){ // TODO: Add your command handler code here CDC*pDC=GetDC();//得到绘图类指针
//RedrawWindow();//重绘窗口
int x,y,x0=200,y0=200,r=50;//圆的圆心为(x0,y0),半径为r int delta,delta1,delta2,direction;x=0;y=r;delta=2*(1-r);while(y>=0){
pDC->SetPixel(x+x0,y+y0,RGB(0,0,255));
pDC->SetPixel(x+x0,-y+y0,RGB(0,0,255));
pDC->SetPixel(-x+x0,y+y0,RGB(0,0,255));
pDC->SetPixel(-x+x0,-y+y0,RGB(0,0,255));
if(delta<0)
{
delta1=2*(delta+y)-1;
if(delta<=0)direction=1;
else direction=2;
}
else if(delta>0)
{
delta2=2*(delta-x)-1;
if(delta2<=0)direction=2;
else direction=3;
}
else direction=2;
switch(direction)
{
case 1:x++;
delta+=2*x+1;
break;
case 2:x++;y--;
delta+=2*(x-y+1);
break;
case 3:y--;
delta+=(-2*y+1);
break;
} } }
由以上代码绘出的图形如下:
(3)以上是本次实验的基本部分,利用中点画圆和Bresenham画圆算法实现的基本图形的绘制。能不能利用该算法,完成一些复杂图形的生成,比如利用基本的画圆算法绘制一个奥运五环。甚至根据画圆算法,实现二次曲线的生成,如椭圆的生成等等。请同学们认真考虑,完成这部分的内容,上机调试。
四、思考
1.如何实现圆心为任意位置的圆的绘制; 2.两种画圆算法的比较。
第三篇:西南交大C语言实验十
实验十 指针应用 ●实验目的
掌握指针的概念,会定义和使用指针变量; 学会使用数组的指针和指向数组的指针变量; 学会使用字符串的指针和指向字符串的指针变量; 学会使用指向函数的指针变量;
了解指向指针的指针的概念及其使用方法。●实验步骤
进入编程环境;
按照题目要求编写程序,自行调试使程序可以正确运行,按照实验指导教师的要求检查。●实验内容
1.输入N个英文单词,建立字符串数组,按字典顺序输出这些英文单词。1.要求用指针。自己编写的源程序:
#include“stdafx.h” #include
int main(){
char word[50][50];int num = 0;printf(“请输入单词数量:”);scanf(“%d”, &num);printf(“请输入%d个单词:”, num);for(int i = 0;i < num;i++){ } char temp[50];for(int i = 0;i < num;i++){
} for(int i = 0;i < 5;i++){ } printf(“%s ”, word[i]);for(int j = 0;j < i;j++){
} if(strcmp(word[i], word[j])< 0){
}
strcpy(temp, word[j]);strcpy(word[j], word[i]);strcpy(word[i], temp);scanf(“%s”, word[i]);
} printf(“n”);return 0;
2.输入一个字符串,不另开辟字符串存储空间,实现字符串逆序存储并输出。自己编写的源程序:
#include“stdafx.h” #include
int main(){
} char str[50];printf(“请输入原字符串:”);scanf(“%s”, str);for(int i = strlen(str)11-i] = temp;
3.任意输入5个学生姓名的拼音,然后存入一个2维的字符数组中,按照字符表先后顺序输出这5个同学的姓名。自己编写的源程序:
#include“stdafx.h” #include
int main(){
char name[5][50];printf(“请输入5个姓名的拼音:”);for(int i = 0;i < 5;i++){
} } scanf(“%s”, name[i]);char temp[50];for(int i = 0;i < 5;i++){
} for(int i = 0;i < 5;i++){ } printf(“n”);return 0;printf(“%s ”, name[i]);for(int j = 0;j < i;j++){
} if(strcmp(name[i], name[j])< 0){
}
strcpy(temp, name[j]);strcpy(name[j], name[i]);strcpy(name[i], temp);
4.定义一个实型数组存入一组无序的实数,用一个函数实现对数组所有元素的升序排序,函数的参数和返回值皆为指针,在主函数中输出排序后的数组,考虑如果不使用指针如何解决该问题,哪一种方法更方便。自己编写的源程序:
#include“stdafx.h” #include
double* sort(doublenum[]);
int main(){
double num[5] = { 0 };printf(“请输入5个实数:”);for(int i = 0;i < 5;i++){ } sort(num);printf(“原数组升序排列结果为:”);for(int i = 0;i < 5;i++){ scanf(“%lf”, &num[i]);
} } printf(“%lf ”, num[i]);printf(“n”);return 0;double* sort(doublenum[]){
} for(int i = 0;i < 5;i++){
} returnnum;for(int j = 0;j < i;j++){
} if(num[i] } double temp = num[j];num[j] = num[i];num[i] = temp; 《计算机图形学》学习报告 东西方建筑中的理性 尽管东方“木构”的暂时性文化和西方“石砌”的永久性文化氛围造成了建筑形式风格的差异,但是它们都兼有理性和感性美。从柱式的英文“order”一词,到中国古建筑等级制的基数开间,无不透露着匠人的理性思考;从古埃及绘画中为了将人的特征最大限度表现而作的头部侧面身体正面的绘画,到文艺复兴达芬奇创造的透视画法,一步步将人们引向更为理性的世界。 西方古典主义者强调构图中的主从关系,突出轴线、讲求配称;倡导理性,主张建筑的真实,反对表现感情和情绪。随之而来的比例、节奏、韵律、秩序美,是建筑区别于雕塑和绘画两大艺术的特点。 维特鲁威提出的建筑三原则:坚固、适用、美观,时时刻刻提醒着我们建筑是要被建造起来的,它是我们的“避难所”,需要理性的结构、缜密的分析和思考。时代在进步,建筑理论从勒杜克的结构理性主义发展到现在的解构主义,再也不是建筑形式适应结构的时代了,而是两者互为促进。 我们对建筑的理解不再是像路易斯康那样再去问砖想做什么,等待它做拱卷的回答。我们向大自然学习,卡拉特拉瓦创造了许多带有理性美的仿生建筑。当我们想进一步拓宽我们的思维时,我们还能向谁求助?计算机图形学为我们打开了理性思考的一扇窗。 计算机图形学对理性建筑的贡献 半个多世纪以来,计算机技术得到了飞速的发展。它的进步不仅仅使世界变得更平,信息交流更便捷,在此平台上开发的各种绘图软件更是将建筑师从传统的手工渲染画图中解放出来,也解放了结构师的工作量。用了30年的时间,计算机的速度从K(103)到T(1012),而从T到Z(1021),我们只用了10年时间。发展的速度是越来越快,我们设计方法和速度都得到了革新。这是这样一个数字化信息化的时代,才有弗兰克盖里建筑的夸张和扎哈哈迪德设计的新奇。 原来我们随手绘出的自由曲线,现在计算机都能帮我们算出是否有建造的可能,以及建筑性能也能在建造前得到分析。在创意上,计算机也能将我们模糊的概念无限发展,给它一个规则,它可能还你一个超乎想象的造型,在理性规则中生成感性而自由的建筑。 知其然,还应知其所以然,看着电视机的变薄,图像更加逼真,这变化的一切都建立在计算机图形学的架构下,了解了基础原理,才能更高效地做高质量的建筑设计。 计算机图形学的理论知识 1.相关概念 计算机图形学是主要研究通过计算机处理用集合数据和数学模型所描述的图形的原理、算法和系统。包括图形的输入、存储、运算、转换、传送和输出。数字化技术是泛指在某特定领域利用包括硬件、软件在内的计算机与电子技术以及数学或数字模型等描述的问题进行求解、模拟或分析活动的一切应用技术。 建筑数字化技术研究应用包括建筑的数字化设计和反映建筑的数字化特征在内的数字技术。而建筑数字化技术的核心几何学科就是计算机图形学。2.反映建筑数字化特征的典型图形技术 建筑的动态特征——图形显示:如奥地利格拉茨美术馆的925盏灯形成的外墙面显示屏 建筑的互动特征——图形显示:如杜瑟赫姆市的随情感变化而色彩变化的建筑物 建筑的数字特征——几何运算:如柏林Max Reinhardt大楼模型及“莫比乌斯环”变换 建筑的虚实特征——交互式图形:如法国国立图书馆(实体与网络图书馆) 设计手段和设计媒体的数字化特征——交互式图形:如纽约韩国基督教长老会教堂 而建筑性能如声环境、热环境、光环境、风环境模拟的可视化分析中都用到了图形学。3.虚拟现实技术(VR) 虚拟现实技术是计算机生成的给人多种感官刺激的虚拟世界(环境),是一种高级的人机交互系统。 虚拟现实技术的三个基本特征:沉浸感、交互性、想象力 它具有多学科的综合性,正如建筑学是一门综合的艺术,虚拟现实技术包括图像处理、图形学、计算几何、多传感器、网络、多媒体和仿真技术等。 正如课堂上老师放映的《碟中谍4》,逼真的爆炸场景,以及从皮克斯动画开始的动物毛发到最近火热的《少年派》逼真的老虎与人共存画面,虚拟现实技术的进步影响到了我们生活的方方面面,触到了我们原来想都不敢想的世界。 而VR技术在建筑行业中,有以下作用:(1)指导设计:让建筑师通过浏览观察和了解空间关系,特别是对空间大小、方向、形状和建筑元素行为的理解。(2)建筑表现与环境仿真(3)仿真施工:检查和修改施工细节、合理性和有效性 4.虚拟现实的基础与关键技术:建模与描绘 基于几何和图形学的建模和描绘技术 直接几何建模 3D扫描建模 投影视图建模 基于图像的场景描绘技术(IBR) 图像投影变形技术 光场重建技术 混合式IBR技术 IBR技术图形的绘制独立于场景的复杂性,仅仅与所要生成画面的分辨率有关。 计算题图形学课程学习体会 计算机图形学是研究用计算机生成、处理和显示图形的一门学科。他的重要性体现在人们越来越强烈的需要和谐的人机交互环境,UI已经成为软件的重要组成部分,以图形的方式表示抽象的概念和数据已经成为信息领域的发张趋势。这门课我们通过自学和同学间互相上课,了解和掌握了计算机图形学的概念、方法和基本的算法。 学习的过程中,感触比较深的是,常常被那些算法所困扰,算法很难理解,解释的枯燥而且难学。原因首先是计算机图形学这门学科本身特点就是综合性很强,涉及的内容和应用广泛,学科交叉复杂。综合了计算机科学、数学、物理学等其他相关学科的知识。而且学科发展日新月异,新的应用领域不断拓展,相关学科相互渗透。其次是与计算机图形学课程中的算法特点有关。很多的算法是为了追求高效率,精益求精,构思独特、实现精巧,算法本身就很难看懂和理解。第三方面就是这门课程是一门理论性和实践性兼顾的综合性课程,实践性很强,不实践就显得空洞,枯燥乏味。 这门课学习的目的是让我们掌握计算机图形学的相关概念、原理和知识,算法的难学难理解,是我们学习的主要障碍。课程实践中,教员让我们自学,互相授课,增强时间体会。在自学和自作可见互相授课过程中,要求要注重基础,强调基本 这些动画,对增强原理、算法的理解性具有很大的作用。 以上是本人在计算机图形课学习过程中的体会,字数不多,确是心得,不足之处还请曹老师指正。第四篇:计算机图形学学习心得
第五篇:计算机图形学学习体会