计算机图形学实验报告

  • 格式:docx
  • 大小:78.84 KB
  • 文档页数:15

实验报告课程名称:计算机图形学学院:信息科学与工程学院专业:数字媒体技术班级:2013级姓名:李义学号:************2015年12月19日山东科技大学教务处制目录:实验一:环境设置 (3)实验二:直线的生成算法 (4)实验三:圆的生成算法 (6)实验四:扫描填充算法 (7)实验五:裁剪算法 (11)实验六:Bezier曲线 (14)实验一:环境设置一、实验目的和要求:1、了解和使用TurboC提供的基本图形函数2、像素点的生成3、掌握Turbo C 进行图形程序设计的基本方法;.4熟悉Visual C++实验环境二、实验内容:1.Turbo C集程序编辑、编译、连接、调试为一体具有速度快、效率高、功能强等优点。

Turbo C是基于DOS平台的C编译系统,占用系统资源少,提供的界面直观、易用。

程序的编译、连接、调试、运行、环境设置等工作都在同一界面上进行,从而用户使用非常方便。

用户在使用Turbo C之前,必须将Turbo C系统安装在用户的磁盘上,建立一个Turbo C的使用环境。

运行Turbo C有两种方式:1)由DOS平台进入Turbo C,2) 由Windows平台进入Turbo C.一个新建立的文件,也可以是一个已存在的文件。

编辑好源文件存盘后,下面的工作就是对源文件(可以是单个文件,也可是多个文件)进行编译、连接和运行。

在Turbo C中,对源程序进行编译、连接和运行可以分三步单独进行,也可以将编译和连接同时进行,然后运行;或者将编译、连接和运行一次完成。

说明:(1)在操作完成后应选Project下的Clear Project,清空当前有效的项目文件(用Project name 指定的),否则系统在以后的编译中仍编译该项目文件,而不是当前编辑屏幕中的源程序。

(2)多文件编译中因出错停止编译的方式用户需要用Project的子菜单Break make on进行设置(图14)。

Errors 表示编译完一个文件后,有“错误”信息就停止编译。

Warnings 表示编译完一个文件后,有“警告”以上信息就停止编译。

Fatal errors 表示编译完所有文件后,停止编译。

Link 进行连接之前停止编译。

图14当程序在编译、连接中没有错误,但运行结果不正确的情况下,我们通常用以下两种方法调试程序。

1)跟踪进入方法,2) 设置断点方法。

设置Turbo C 环境参数是指出包含文件和库文件存放的位置以及输出文件(.OBJ和.EXE)准备存放的位置。

设置Turbo C 环境参数通过主菜单Options中的选项完成,如图21。

图212熟悉Visual C++实验环境(1)启动Developer Studio,了解初始化界面由哪些部分组成查看各菜单项,看看都有哪些子菜单和命令(2) 将鼠标放置于各工具条图标上,系统会自动显示该图标代表的命令含义,了解一下都有哪些命令。

(3) 在任意工具条上单击鼠标右键,弹出式菜单上将显示所有可用的工具条,选择其中没有对号(√)的项,看看有什么效果,再选择有对号的项看有什么效果。

(4) 将鼠标移动到任意工具条上,将鼠标放到图标间隙,按下鼠标左键不放,移动鼠标到屏幕中间,看有什么现象发生,再将它拖回到原来位置观察有什么现象发生。

(5) 将鼠标移动到下边的输出窗口,按鼠标右键,弹出一个菜单,选择其中的菜单项”Hide”,选择菜单View|Output,重新显示该窗口,看窗口是不是又显示出来了。

(6) 学习使用帮助系统。

在Visual C++5.0中,在工作区窗口的InfoView中选择内容,双击它,在文档区显示具体的帮助信息。

在Visual C++6.0,选择菜单Help|Contents,启动MSDN联机帮助系统,学习使用该帮助系统。

选File|Exit退出Developer Studio。

(2)像素是组成图形的最小单位,像素的大小可以通过设置不同的显示方式来改变。

该实验实现了简单圆的生成(3)基于Turbo C的开发环境实现人造卫星运动动画。

实验二:直线的生成算法一、实验目的1、通过用中点画线法绘制直线,加深对算法原理的理解。

2、对程序以及函数的细节有更深入的把握。

二、实验要求实现一个直线的中点生成算法的程序三、实验原理当前像素点为(x p,y p),下一个像素点有两个可选择点P1(x p+1,y p+1)或P2(x p+1,y p+1)。

若M=(xp+1,yp+0.5)为P1与P2之中点,Q为理想直线x=x p+1垂线的交点。

当M在Q的下方时,则P2应为下一个象素点;M在Q的上方,应取P1为下一点。

构造判别式:d=F(M)=F(x p+1,y p+0.5) =a(x p+1)+b(y p+0.5)+c其中a=y0-y1, b=x1-x0, c=x0y1-x1y0。

当d<0,M在L(Q点)下方,取右上方P2为下一个象素;当d>0,M在L(Q点)上方,取右方P1为下一个象素;当d=0,选P1或P2均可,约定取P1为下一个象素;若当前象素处于d>=0情况,则取正右方象素P1 (xp+1, yp), 要判下一个象素位置,应计算d1 = F(xp+2, yp+0.5)=a(xp+2)+b(yp+0.5)=d+a;增量为a若d<0时,则取右上方象素P2 (xp+1, yp+1)。

要判断再下一象素,则要计算d2 = F(xp+2, yp+1.5)=a(xp+2)+b(yp+1.5)+c=d+a+b ;增量为a+b1、画线从(x0, y0)开始,d的初值d0 = F(x0+1, y0+0.5)=F(x0, y0)+a+0.5b =a+0.5b。

可以用2d代替d来摆脱小数,提高效率。

四、主要代码v oid Midpoint_Line(CDC *pdc,int x0,int y0,int x1,int y1,int color){int a,b,d,d1,d2,x,y;a=y0-y1,b=x1-x0,d=2*a+b;d1=2*a,d2=2*(a+b);x=x0,y=y0;pdc->SetPixel(x,y,color);while(x<x1){if(d<0){x++;y++;d+=d1;}else{x++;d+=d2;}pdc->SetPixel(x,y,color);}}void CMy2View::On1(){// TODO: Add your command handler code hereint x0,x1,y0,y1,color;x0=111;y0=111;x1=138;y1=138;color=RGB(255,0,0);CClientDC dc(this);Midpoint_Line(&dc,x0,y0,x1,y1,color);}五、实验心得写代码时一定要细心,不能漏写、写错,另外,要注意分号的使用。

实验三:圆的生成算法一、实验目的1、通过用中点画圆法绘制圆,加深对算法原理的理解。

2、对程序以及函数的细节有更深入的把握。

二、实验要求实现一个圆的中点生成算法的程序三、实验原理如果我们构造函数F(x,y)=x2+y2-R2,则对于圆上的点有F(x,y)=0,对于圆外的点有F(x,y)>0,对于圆内的点F(x,y)<0 。

与中点画线法一样,构造判别式:d=F(M)=F(x p+1,y p-0.5)=(x p+1)2+(y p-0.5)2-R2若d<0,则应取P1为下一象素,而且再下一象素的判别式为:d=F(x p+2,y p-0.5)=(x p+2)2+(y p-0.5)2-R2=d+2x p+3若d≥0,则应取P2为下一象素,而且下一象素的判别式为d=F(x p+2,y p-1.5)=(x p+2)2+(y p-1.5)2-R2=d+2(x p-y p)+5我们这里讨论的第一个象素是(0,R),判别式d的初始值为:d0=F(1,R-0.5)=1.25-R四、主要代码v oid CDrawCircleView::OnMidPoint(){CDC *pDC=GetDC();int xc=200,yc=300,r=50,c=0;int x,y; float d;x=0;y=r;d=1.25-r;pDC->SetPixel((xc+x),(yc+y),c);pDC->SetPixel((xc-x),(yc+y),c);pDC->SetPixel((xc+x),(yc-y),c);pDC->SetPixel((xc-x),(yc-y),c);pDC->SetPixel((xc+y),(yc+x),c);pDC->SetPixel((xc-y),(yc+x),c);pDC->SetPixel((xc+y),(yc-x),c);pDC->SetPixel((xc-y),(yc-x),c);while(x<=y){if(d<0)d+=2*x+3;else{d+=2*(x-y)+5;y--;}x++;pDC->SetPixel((xc+x),(yc+y),c);pDC->SetPixel((xc-x),(yc+y),c);pDC->SetPixel((xc+x),(yc-y),c);pDC->SetPixel((xc-x),(yc-y),c);pDC->SetPixel((xc+y),(yc+x),c);pDC->SetPixel((xc-y),(yc+x),c);pDC->SetPixel((xc+y),(yc-x),c);pDC->SetPixel((xc-y),(yc-x),c);Sleep(1);}ReleaseDC(pDC);}五、实验心得在程序调试中有很多错误,最后发现是没有弄清函数的主调关系,最后查阅了资料,调试好了程序。

实验四:扫描填充算法一、实验目的1、掌握多边形扫描填充算法的思路2、对程序以及函数的细节有更深入的把握。

二、实验要求用VC编程实现扫描线填充算法三、实验原理对于给定的一个多变形,用一组水平的扫描线进行扫描,对每一条扫描线均可求出与多边形边的交点,这些交点将扫描线分割成落在多边形内部的线段和落在多边形外部的线段,并且两者相间排列,将落在多边形内部的线段上的所有像素点赋以给定的填充色彩。

这样不需要检验每一个像素点,而只考虑与多边形相交的交点分割后的扫描线段。

首先将有效多边形边界存储在一个有序边表中:有序边表每一个元素对应一条扫描线并按照扫描线从低到高排列;多边形的每条边,按照较低端点的y1值,存储在边表y1扫描线对应元素指向的链表中,链表中的节点记录了边的高端y2值、低端的x1值和1/m,这样就可以知道扫描线有没有和这条边相交(是否在y1和y2之间),初始交点(y1,x1),中间交点(y1+k,x1+k/m)。