搜档网
当前位置:搜档网 › 计算机图形学实验指导书

计算机图形学实验指导书

计算机图形学实验指导书
计算机图形学实验指导书

《计算机图形学》实验指导书

制定人:刘岩牛翠霞

教研室:数字媒体教研室

计算机科学与技术学院

2008 年 9 月

前言

《计算机图形学》课程是计算机科学与技术专业的重要专业课程之一,计算机图形学的主要实验内容就是验证如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。

该实验指导书给出了四个图形学中最基本的实验操作。即图形绘制、图形几何变换、图形裁剪和图形填充。力求学生通过该实验指导书,提高上机操作能力,将具体算法进行编程演示,达到更好的效果,并了解相应图形应用软件的开发编写情况。

实验要求

《计算机图形学》课程实验的目的是为了使学生在课程学习的同时,通过在具体的编程环境中的实际操作,对计算机图形学的基本概念和方法能有一个初步的了解,使学生更好地掌握《计算机图形学》教学大纲要求的内容。

在《计算机图形学》的课程实验过程中,要求学生做到:

一、预习实验指导书有关部分,认真做好实验内容的准备,就实验可能出现的情况提前做出思考和分析。

二、认真书写实验报告。实验报告包括实验目的和要求,实验情况及其分析。写出程序设计说明,给出源程序框图和清单。

三、遵守机房纪律,服从辅导教师指挥,爱护实验设备。

目录

实验1 基本图形生成算法 (5)

实验2 多边形填充 (8)

实验3 多边形裁剪 (10)

实验4 图形变换 (13)

实验1基本图形生成算法

一、实验目的

直线的生成是用计算机生成图形最基本的技能,通过本实验使学生掌握如何用计算机生成直线和改变直线的属性。熟悉开发环境;生成直线、二次曲线等基本图形。

二、实验原理

一、直线的DDA算法

DDA是数字微分分析式(Digital Differential Analyzer)的缩写。已知直线两端点(x1,y1)、(x2,y2),则斜率m为:

m = (y2-y1)/(x2-x1)= Dx/Dy;

直线中的每一点坐标都可以由前一点坐标变化一个增量(Dx, Dy)而得到,即表示为递归式:

xi+1=xi+Dx yi+1=yi+Dy

递归式的初值为直线的起点(x1, y1),这样,就可以用加法来生成一条直线。

二、Bresenham算法画直线

本算法由Bresenham在1965年提出。设直线从起点(x1, y1)到终点(x2, y2)。直线可表示为方程y=mx+b。其中

b = y1 - m * x1,

m = (y2-y1)/(x2-x1)=dy/dx

我们的讨论先将直线方向限于第一象限,在这种情况下,当直线光栅化时,x每次都增加1个单元,即xi+1=xi+1,而y相应增加应当小于1。为了光栅化,yi+1只可能yi+1=yi 或者 yi+1=yi+1。选择的原则是看精确值y与yi及yi+1的距离d1及d2的大小而定。计算式为:

y=m(xi+1)+b (1.1)

d1=y-yi (1.2)

d2=yi+1-y (1.3)

如果d1-d2>0,则yi+1=yi+1,否则yi+1=yi。因此算法的关键在于简便地求出d1-d2的符号。将式(1.1)、(1.2)、(1.3)代入d1-d2,得

d1-d2=2y-2yi-1=2(dy/dx) (xi+1)-2yi+2b-1

用dx乘等式两边,并以Pi=dx(d1-d2)代入上述等式,得

Pi=2xidy-2yidx+2dy+dx(2b-1) (1.4)

d1-d2是我们用以判断符号的误差。由于在1a象限,dx总大于0,所以Pi仍旧可以用作判断符号的误差。Pi-1为:

Pi+1=Pi+2dy-2dx(yi+1-yi) (1.5)

误差的初值P1,可将x1, y1,和b代入式(1.4)中的xi, yi而得到:

P1=2dy-dx (1.6)

综述上面的推导,第一象限内的直线Bresenham算法思想如下:

1.画点(x1, y2); dx=x2-x1; dy=y2-y1;

计算误差初值P1=2dy-dx; i=1;

2.求直线的下一点位置:

xi+1=xi+1;

if Pi>0 则yi+1=yi+1;

否则yi+1=yi;

3.画点(xi+1, yi-1);

4.求下一个误差Pi+1;

if Pi>0 则Pi+1=Pi+2dy-2dx;

否则Pi+1=Pi+2dy;

5.i=i+1; if i

三、实验内容

(1)熟悉VC++6.0开发环境;

(2)分别用DDA算法、Bresenham算法生成直线;用Bresenham算法和DDA算法生成圆。

四、实验方法与步骤

(1)在VC++6.0环境下创建名为BmpRead的MFC应用程序工程(单文档)

(2)编程实现DDA算法和算法画直线,同时利用两种算法画圆。

(3)算法示例:

(4)DDA算法实现:

dda_line(int xa,int ya,int xb,int yb,HDC hdc)

{

float delta_x,delta_y,x,y;

int dx,dy,steps,k;

dx=xb-xa;

dy=yb-ya;

if(abs(dx)>abs(dy))

steps=abs(dx);

else steps=abs(dy);

delta_x=(float)dx/(float)steps;

delta_y=(float)dy/(float)steps;

x=xa;

y=ya;

SetPixel(hdc,x,y,0x0000ff);

for(k=1;k<=steps;k++)

{

x+=delta_x;

y+=delta_y;

SetPixel(hdc,x,y,0x0000ff);

}

}

(5)Breasenham算法示例(略)

(6)DDA和Breasenham算法实现画圆:思路:将圆分成八个区域来画

实验2多边形填充

一、实验目的

通过构造各种几何图形并填充,使学生掌握图形填充的基本技能,了解区域填充算法,重点掌握扫描线填充算法。

二、实验原理

区域填充即给出一个区域的边界,要求对边界范围内的所有象素单元赋予指定的颜色代码。区域填充中最常用的是多边形填色,本节中我们就以此为例讨论区域填充算法。

填色算法分为两大类:

1.扫描线填色(Scan-Line Filling)算法。这类算法建立在多边形边边界的矢量形式数据之上,可用于程序填色,也可用交互填色。

2.种子填色(Seed Filling)算法。这类算法建立在多边形边边界的图象形式数据之上,并还需提供多边形界内一点的坐标。所以,它一般只能用于人机交互填色,而难以用于程序填色。

扫描线填色算法的基本思想是:用水平扫描线从上到下扫描由点线段构成的多段构成的多边形。每根扫描线与多边形各边产生一系列交点。将这些交点按照x坐标进行分类,将分类后的交点成对取出,作为两个端点,以所填的色彩画水平直线。多边形被扫描完毕后,填色也就完成。

三、实验内容

用VC编程,掌握扫描线填色算法。要求构造几何图形并填充。

四、实验方法与步骤

(1)新建工程,绘制几何图形,同时进行扫描线添色。

(2)具体程序如下:

typedef struct {

int y_top;

float x_int;

int delta_y;

floaat x_change_per_scan;

} EACH_ENTRY;

//以下略

(3)程序提示:

1、sort_on_bigger_y子程序的主要功能是按照输入的多边形,建立起活性边表。操作步骤是:对每条边加以判断:如非水平边则调用put_in_side_list子程序放入活性边来;如是水平边则直接画出。

2、put_in_sides_list子程序的主要功能是将一条边存入活性边表之内。操作步骤是:对该边判别是否左顶点或右顶点,如果将入边之终点删去,按照y_top的大小在活性边表中找到该点的合适位置,在该边的位置中填入数据。

3、update_first_and_last子程序的主要功能是刷新活性边表的first和last两根指针的所指位置,以保证指针指出激活边的范围。

4、process_x_intersections子程序的主要功能是对活性边表中的激活边,按照x_int的大小排序。操作步骤是:从first到last,调用sort_on_x子程序排入活性边表中合适位置。

5、sort_on_x子程序主要功能是将一条边side[entry],在活性边表的first到entry之间按x_int的大小插入合适位置。操作步骤是:检查位于entry的边的x_int是否小于位置entry-1的边的x_int,如是,调用swap子程序交换两条边的彼此位置。

6、swap子程序的主要功能是交换活性边表中两条相邻位置边的彼此位置。

7、draw_lines子程序的主要功能是在一条扫描线位于多边形内的部分,填上指定的色彩。操作步骤是:在活性边表的激活边范围内,依次取出Δy1 0两边的x_int,作为两个端点(x1, scan),(x2, scan),画一条水平线。

8、update_sides_list子程序的主要功能是刷新活性边表内激活边的值:

Δy=Dy-1

x_int=x_int_x_chang_per_scan。

实验3 多边形裁剪

一、实验目的

验证一种多边形裁剪算法。

二、实验原理

基本思想是一次用窗口的一条边裁剪多边形。考虑窗口的一条边以及延长线构成的裁剪线该线把平面分成两个部分:可见一侧;不可见一侧基本思想是一次用窗口的一条边裁剪多边形。考虑窗口的一条边以及延长线构成的裁剪线该线把平面分成两个部分:可见一侧;不可见一侧多边形的各条边的两端点S 、P 。它们与裁剪线的位置关系只有四种

情况(1)仅输出顶点P ; 情况(2)输出0个顶点;

情况(3)输出线段SP 与裁剪线的交点I ; 情况(4)输出线段SP 与裁剪线的交点I 和终点P

上述算法仅用一条裁剪边对多边形进行裁剪,得到一个顶点序列,作为下一条裁剪边处理过程的输入。

对于每一条裁剪边,只是判断点在窗口哪一侧以及求线段SP 与裁剪边的交点算法应随之改变。

三、实验内容

用VC 编程,使用VC 编程,实现多边形裁剪算法。

四、实验方法与步骤

参考算法 typedef struct

{ float x; float y; }Vertex;

见一

可见一

S S S p

p (1)(2)

(3)

(4)

typedef Vertex Edge[2];

typedef Vertex VertexArray[MAX];

SutherlandHodgemanClip(VertexArray InVertexArray, VertexArray OutVertexArray, edge ClipBoundary, int &Inlength, int &Outlength){

Vertex S,P, ip;

int j;

Outlength = 0;

S = InVertexArray [InLength -1];

for (j = 0; j < Inlength; j++)

{

P = InVertexArray [j];

if(Inside (P, ClipBoundary))

{

if(Inside (S, ClipBoundary)) //SP在窗口内,情况1

Output(P, OutLength, OutVertex Array) ;

else

{ //S在窗口外, 情况4

Intersect (S, P, ClipBoundary, &ip);

Output (ip, OutLength, OutVertexArray);

Output (P, OutLength, OutVertexArray);

}

}

else if (Inside (S, WindowsBoundary))

{ //S在窗口内,P在窗口外,情况3

Intersect (S, P, ClipBoundary, &ip);

Output (ip, OutLength, OutVertexArray);

} //情况2没有输出

S = P;

}

}

//判点在窗口内

bool Inside (Vertex &TestPt, Edge ClipBoundary)

{

if(ClipBoundary[1].x> ClipBoundary[0].x)//裁剪边为窗口下边

if(testpt.y>= ClipBoundary[0].y) return TRUE;

else if(ClipBoundary[1].x< ClipBoundary[0].x) //裁剪边为窗口上边if(testpt.y<= ClipBoundary[0].y) return TRUE;

else if(ClipBoundary[1].y> ClipBoundary[0].x) //裁剪边为窗口右边 if(testpt.x<= ClipBoundary[0].x) return TRUE;

else if(ClipBoundary[1].y< ClipBoundary[0].y) //裁剪边为窗口左边

if(testpt.x>= ClipBoundary[0].x) return TRUE;

return FALSE;

}

//直线段SP和窗口边界求交,返回交点;

void Intersect (Vertex&S,Vertex &P,Edge ClipBoundary,Vertex& IntersectPt)

{

if(ClipBoundary[0].y== ClipBoundary[1].y)//水平裁剪边

{

IntersectPt.y = ClipBoundary[0].y;

IntersectPt.x = S.x+( ClipBoundary[0].y -S.y)*(P.x - S.x) / (P.y - S.y); }

else //垂直裁剪边

{

Intersect.x = ClipBoundary[0].x;

Intersect.y = S.y + (ClipBoundary[0].x - S.x)*(P.y - S.y) / (P.x. - S.x); }

}

实验4图形变换

一、实验目的

利用实验一生成的直线、二次曲线等基本图形进行二维图形的各种几何变换。

二、实验原理

图形的几何变换一般是指对图形的几何信息经过变换后产生新的图形,图形几何变换既可以看作是坐标系不动而图形变动,变动后的图形在坐标系中的坐标值发生变化;出可以看作图形不动而坐标系变动,变动后的图形在新坐标系下具有新的坐标值。这两种情况本质上都是一样的,都是图形由新的坐标值表示,因此是新产生的图形。图形几何变换包括比例变换、对称变换、错切变换、旋转变换、平移变换及其复合变换。图形上所有的点在几何变换前后的坐标关系一般用解析几何方法可以求得,但这些几何关系用矩阵方法表示,运算更为方便。

图形基本几何变换是指比例变换、对称变换、错切变换、旋转变换和平移变换等。除平移变换外,这里其它四种几何变换都可以用组成图形的点向量(或称1×2阶矩阵)和2×2阶变换矩阵相乘表示,而平移变换需引入新方法来实现。

三、实验内容

用VC编程,用VC编程,实现如下变换:1.平移变换 2.旋转变换 3.对称变换 4.比例缩放变换。

四、实验方法与步骤

在实验一的基础上对其图形分别进行平移变换、旋转变换、对称变换以及比例变换。

程序代码示例如下:

###########################图形平移变换##########################

参数说明:

//lpDIBBits 源图像数据去指针

//lWidth 宽度

//lHeight 高度

//lXOffset X轴线偏移

//lYOffset Y轴线偏移

//函数说明:该函数实现图像的平移操作

BOOL TranslationDIB1(LPSTR lpDIBBits, LONG lWidth, LONG lHeight, LONG lXOffset, LONG lYOffset)

{

// 略

}

##########################图像旋转变换##############################

/参数说明:

// HWND hWnd:窗口句柄

//程序说明:图像的旋转

BOOL Rotation(HWND hWnd)

{

//略

}

############################图像对称变换#############################

//函数参数:

//hWnd是窗口句柄

//Xdirection 是镜像方向(对称变换)

//函数说明:该函数根据输入的方向参数实现窗口图像的镜像处理

BOOL Mirror(HWND hWnd,BOOL XDirection)

{

//略

}

###########################图像缩放变换##############################

//参数说明:

// HWND hWnd:窗口句柄

//程序说明:进行图像的缩放

BOOL Zoom(HWND hWnd)

{

//略

}

主要参考书:

计算机图形学,张彩明出版社: 科学技术出版社. 出版时间:2002年。

计算机图形学实验内容汇总

计算机图形学实验 肖加清

实验一图形学实验基础 一、实验目的 (1)掌握VC++绘图的一般步骤; (2)掌握OpenGL软件包的安装方法; (3)掌握OpenGL绘图的一般步骤; (4)掌握OpenGL的主要功能与基本语法。 二、实验内容 1、VC++绘图实验 (1)实验内容:以下是绘制金刚石图案。已给出VC++参考程序,但里面有部分错误,请改正,实现以下图案。 N=3 N=4

N=5 N=10 N=30

N=50 (2)参考程序 //自定义的一个类 //此代码可以放在视图类的实现文件(.cpp) 里class CP2 { public: CP2(); virtual ~CP2(); CP2(double,double); double x; double y; }; CP2::CP2() { this->x=0.0; this->y=0.0; } CP2::~CP2() { } CP2::CP2(double x0,double y0) { this->x=x0; this->y=y0; }

//视图类的一个成员函数,这个成员函数可以放在OnDraw函数里调用。 //在视图类的头文件(.h)里定义此函数 void Diamond(); //在视图类的实现文件(.cpp)里实现此函数 void CTestView::Diamond() { CP2 *P; int N; double R; R=300; N=10; P=new CP2[N]; CClientDC dc(this); CRect Rect; GetClientRect(&Rect); double theta; theta=2*PI/N; for(int i=0;i #include #include #include //定义输出窗口的大小 #define WINDOW_HEIGHT 300

研究生计算机图形学课程室内场景OpenGL--实验报告Word版

《高级计算机图形学》实验报告 姓名:学号:班级: 【实验报告要求】 实验名称:高级计算机图形学室内场景 实验目的:掌握使用OpenGL生成真实感复杂对象的方法,进一步熟练掌握构造实体几何表示法、扫描表示法、八叉树法、BSP树法等建模方法。 实验要求:要求利用OpenGL生成一个真实感的复杂对象及其周围场景,并显示观测点变化时的几何变换,要具备在一个纹理复杂的场景中漫游功能。要求使用到光线跟踪算法、 纹理映射技术以及实时绘制技术。 一、实验效果图 图1:正面效果图

图2:背面效果图 图4:背面效果图

图4:室内场景细节效果图 图5:场景角度转换效果图

二、源文件数据代码: 共6个文件,其实现代码如下: 1、DlgAbout.cpp #include "StdAfx.h" #include "DlgAbout.h" CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() 2、FormCommandView.cpp #include "stdafx.h" #include "Tool.h" #include "MainFrm.h" #include "FormCommandView.h" #include "ToolDoc.h" #include "RenderView.h" // Download by https://www.sodocs.net/doc/e98385463.html, #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // CFormCommandView IMPLEMENT_DYNCREATE(CFormCommandView, CFormView) CFormCommandView::CFormCommandView() : CFormView(CFormCommandView::IDD) { //{{AFX_DATA_INIT(CFormCommandView)

电脑DIY实验指导书

电脑DIY实验指导书 《电脑DIY》实验指导书 实验一了解计算机的组成3-13 一、实验目的 1、观察计算机系统的组成; 2、通过观察了解计算机系统中各个部件的连接方法; 3、了解各部件在系统中的作用。 二、实验前的准备工作 认真阅读本实验内容,准备打开主机箱的工具并按要求准备做好记录。 三、实验指导 在实验过程中要注意观察,并做好观察记录。 四、实验内容 1、观察系统外部设备的连接状况,记录各外设的名称、型号和与主机连接点情况; 2、在教师的指导下将外设去掉,用准备好的工具将主机箱打开; 3、观察主机的结构,记录主机箱内包含的部件的名称、规格等,如图所示:

电脑DIY 实验指导书 4、了解各部件的作用,看清楚部件的安装位置; 5、将主机箱安装好,并把外设连接好; 6、整理好使用过的用品,实验结束。 五、实验报告要求 1、将在实验过程中观察到的部件或设备按顺序记录在实验报告单上; 2、将你认为没有看明白的部分写出来。 这一次实验认识了计算机的组成,了解了cpu 、主板、内存的分类,认识了主板的南北桥芯片的作用和位置,知道了在以后购买时候应当注意的内容,知道如何选择硬件。了解了各个部位的主要硬件指标。

电脑DIY实验指导书 实验二计算机硬件的组装3-24 一、实验目的 1、在识别各个部件和板卡的基础上,将它们组装在一起; 2、通过对计算机系统的组装,进一步熟悉各部件的功能; 3、掌握安装和拆卸计算机部件的方法与注意事项。 二、实验前的准备工作 准备好必要的工具,认真阅读各部件的使用说明书,并按要求准备做好记录。 三、实验指导 在实验过程中要按安装步骤进行安装,找准各部件的安装位置,注意在拆装的过程中要用力均匀,防止损坏设备。 四、实验内容 1、按要求做好准备工作; 2、可将主板放置在绝缘泡沫板上; 3、将CPU、内存条和CPU风扇等安装在主板上; 4、将主板装入主机箱,拧紧主板的固定螺丝; 5、把电源固定在机箱的相应位置,并接好主板电源线; 6、安装显卡、声卡等内置板卡,并设置好主板跳线; 7、安装好硬盘、软驱和光驱等部件; 8、检查并确认安装正确无误; 9、连接好显示器、键盘和鼠标后可开机试验; 10、能正常启动后,请关机、断电并按相反顺序将各部件拆卸开放回原来位置。

计算机图形学实验报告

《计算机图形学》实验报告姓名:郭子玉 学号:2012211632 班级:计算机12-2班 实验地点:逸夫楼507 实验时间:15.04.10 15.04.17

实验一 1 实验目的和要求 理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析实验数据的能力; 编程实现DDA 算法、Bresenham 中点算法;对于给定起点和终点的直线,分别调用DDA 算法和Bresenham 中点算法进行批量绘制,并记录两种算法的绘制时间;利用excel 等数据分析软件,将试验结果编制成表格,并绘制折线图比较两种算法的性能。 2 实验环境和工具 开发环境:Visual C++ 6.0 实验平台:Experiment_Frame_One (自制平台) 3 实验结果 3.1 程序流程图 (1)DDA 算法 是 否 否 是 是 开始 计算k ,b K<=1 x=x+1;y=y+k; 绘点 x<=X1 y<=Y1 绘点 y=y+1;x=x+1/k; 结束

(2)Mid_Bresenham 算法 是 否 否 是 是 是 否 是 否 开始 计算dx,dy dx>dy D=dx-2*dy 绘点 D<0 y=y+1;D = D + 2*dx - 2*dy; x=x+1; D = D - 2*dy; x=x+1; x

3.2程序代码 //-------------------------算法实现------------------------------// //绘制像素的函数DrawPixel(x, y); (1)DDA算法 void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1) { //----------请实现DDA算法------------// float k, b; float d; k = float(Y1 - Y0)/float(X1 - X0); b = float(X1*Y0 - X0*Y1)/float(X1 - X0); if(fabs(k)<= 1) { if(X0 > X1) { int temp = X0; X0 = X1; X1 = temp; }

硬件基础实验指导书与答案

《计算机硬件基础》课程实验指导书 辽宁工程技术大学软件学院 2017年5月

目录 64位操作系统下使用MASM (3) 实验上机操作范例 (5) 实验一CPU结构 (15) 实验二指令格式 (22) //实验三循环程序设计 (25) 实验四综合程序设计(一) (32) 实验五综合程序设计(二) (36) 实验六高级汇编技术 (42)

64位操作系统下使用MASM 1.安装DOSBox。双击DOSBox0.74-win32-installer.exe。 2.运行DOSBox。双击桌面的DOSBox快捷方式,如图1所示。 图1 运行DOSBOX虚拟机 3.将MASM文件夹里的全部文件拷贝到一个目录下,比如d:\masm下,然后将这个目录挂载为DOSBox的一个盘符下,挂载命令为Mount c d:\masm 。然后切换到挂载的c盘,如图2所示。

图2 挂载masm文件夹3.编译汇编源程序,如图3所示。 图3 汇编源程序4.连接和运行源程序,如图4所示。 图4连接和运行源程序

实验上机操作范例 【范例】完成具有如下功能的分段函数 1 X>0 Y = 0 X=0 -1 X<0 其中:X存放在内存单元中,Y为结果单元。【问题分析】根据题意画出程序流程图,如图1所示。 图1 分段函数的程序流程图 根据程序流程图编写如下程序 DSEG SEGMENT X DW ? Y DW ? DSEG ENDS CSEG SEGMENT ASSUME CS: CSEG, DS: DSEG

START:MOV AX, DSEG MOV DS, AX LEA SI, X MOV AX, [SI] AND AX, AX JNS LP1 MOV Y, 0FFH ; X<0 JMP END1 LP1: JNZ LP2 MOV Y, 00H JMP END1 LP2: MOV Y, 01H END1: MOV AH, 4CH INT 21H CSEG ENDS END START 汇编语言程序的开发分为以下4个部分:编辑(生成.asm文件)—→汇编(生成.obj文件)—→连接(生成.exe文件)—→调试。 下面介绍汇编语言源程序从编辑到生成一个可执行文件(.exe文件)的过程。利用Microsoft公司提供的MASM6.15版本的工具包(包括MASM.EXE、LINK.EXE、ML.EXE、DEBUG32.EXE等),如图2所示。

计算机图形学实验报告

目录

实验一直线的DDA算法 一、【实验目的】 1.掌握DDA算法的基本原理。 2.掌握DDA直线扫描转换算法。 3.深入了解直线扫描转换的编程思想。 二、【实验内容】 1.利用DDA的算法原理,编程实现对直线的扫描转换。 2.加强对DDA算法的理解和掌握。 三、【测试数据及其结果】 四、【实验源代码】 #include #include #include #include GLsizei winWidth=500; GLsizei winHeight=500; void Initial(void)

{ glClearColor(1.0f,1.0f,1.0f,1.0f); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150.0); } void DDALine(int x0,int y0,int x1,int y1) { glColor3f(1.0,0.0,0.0); int dx,dy,epsl,k; float x,y,xIncre,yIncre; dx=x1-x0; dy=y1-y0; x=x0; y=y0; if(abs(dx)>abs(dy)) epsl=abs(dx); else epsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { glPointSize(3); glBegin(GL_POINTS); glVertex2i(int(x+0.5),(int)(y+0.5)); glEnd(); x+=xIncre;

计算机图形学实验二

实验报告 课程名称:计算机图形学 实验项目:区域填充算法 实验仪器:计算机 系别:计算机学院 专业:计算机科学与技术 班级姓名:计科1602/ 学号:2016011 日期:2018-12-8 成绩: 指导教师:

一.实验目的(Objects) 1.实现多边形的扫描线填充算法。 二.实验内容 (Contents) 实现多边形的扫描线填充算法,通过鼠标,交互的画出一个多边形,然后利用种子填充算法,填充指定的区域。不能使用任何自带的填充区域函数,只能使用画点、画线函数或是直接对图像的某个像素进行赋值操作;

三.实验内容 (Your steps or codes, Results) //widget.cpp //2016CYY Cprogramming #include"widget.h" #include #include #include using namespace std; #define H 1080 #define W 1920 int click = 0; //端点数量 QPoint temp; QPoint first; int result = 1; //判断有没有结束 int sign = 1; //2为画线 int length = 5; struct edge { int ymax; float x; float dx; edge *next; }; edge edge_; QVector edges[H]; QVector points;//填充用 bool fin = false; QPoint *Queue = (QPoint *)malloc(length * sizeof(QPoint)); //存放端点的数组 Widget::Widget(QWidget *parent) : QWidget(parent) { } Widget::~Widget() { } void Widget::mouseMoveEvent(QMouseEvent *event) { setMouseTracking(true); if (click > 0 && result != 0) { startPt = temp; endPt =event->pos(); sign = 2; update(); } } void Widget::mouseReleaseEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { } else if (event->button() == Qt::RightButton) { sign = 2;

计算机图形学实验报告,DOC

欢迎共阅

目录

实验一直线的DDA算法 一、【实验目的】 1.掌握DDA算法的基本原理。 2.掌握 3. 1.利用 2.加强对 四 { glClearColor(1.0f,1.0f,1.0f,1.0f); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150.0); } voidDDALine(intx0,inty0,intx1,inty1) { glColor3f(1.0,0.0,0.0); intdx,dy,epsl,k; floatx,y,xIncre,yIncre; dx=x1-x0;dy=y1-y0;

x=x0;y=y0; if(abs(dx)>abs(dy))epsl=abs(dx); elseepsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { glPointSize(3); glBegin(GL_POINTS); glEnd(); } } { } { } { glutInitWindowSize(400,300); glutInitWindowPosition(100,120); glutCreateWindow("line"); Initial(); glutDisplayFunc(Display); glutReshapeFunc(winReshapeFcn); glutMainLoop(); return0; }

计算机组成原理实验指导书

计算机组成原理 实验报告 学号: 姓名: 提交日期: 成绩: 计算机组成原理实验报告 Computer Organization Lab Reports ______________________________________________________________________________ 班级: ____ 姓名:____学号:_____ 实验日期:____

一.实验目的 1. 熟悉Dais-CMX16+达爱思教仪的各部分功能和使用方法。 2. 掌握十六位机字与字节运算的数据传输格式,验证运算功能发生器及进位控制的组合功能。了解运算器的工作原理。 3. 完成算术、逻辑、移位运算实验,熟悉ALU运算控制位的运用。 ______________________________________________________________________________二.实验环境 Dais-CMX16+达爱思教仪 ______________________________________________________________________________三.实验原理 实验中所用的运算器数据通路如图1-1所示。ALU运算器由CPLD描述。运算器的输出经过2片74LS245三态门与数据总线相连,2个运算寄存器AX、BX的数据输入端分别由4个74LS574锁存器锁存,锁存器的输入端与数据总线相连,准双向I/O输入输出端口用来给出参与运算的数据,经2片74LS245三态门与数据总线相连。 图1-1 运算器数据通路 图1-1中,AXW、BXW在“搭接态”由实验连接对应的二进制开关控制,“0”有效,通过【单拍】按钮产生的负脉冲把总线上的数据打入,实现AXW、BXW写入操作。 表1-1 ALU运算器编码表 算术运算逻辑运算 M M13 M12 M11 功能M M13 M12 M11 功能 M S2 S1 S0 M S2 S1 S0 0 0 0 0 A+B+C 1 0 0 0 读B 0 0 0 1 A—B —C 1 0 0 1 非A 0 0 1 0 RLC 1 0 1 0 A-1

《计算机图形学实验报告》

一、实验目的 1、掌握中点Bresenham直线扫描转换算法的思想。 2掌握边标志算法或有效边表算法进行多边形填充的基本设计思想。 3掌握透视投影变换的数学原理和三维坐标系中几何图形到二维图形的观察流程。 4掌握三维形体在计算机中的构造及表示方法 二、实验环境 Windows系统, VC6.0。 三、实验步骤 1、给定两个点的坐标P0(x0,y0),P1(x1,y1),使用中点Bresenham直线扫描转换算法画出连接两点的直线。 实验基本步骤 首先、使用MFC AppWizard(exe)向导生成一个单文档视图程序框架。 其次、使用中点Bresenham直线扫描转换算法实现自己的画线函数,函数原型可表示如下: void DrawLine(CDC *pDC, int p0x, int p0y, int p1x, int p1y); 在函数中,可通过调用CDC成员函数SetPixel来画出扫描转换过程中的每个点。 COLORREF SetPixel(int x, int y, COLORREF crColor ); 再次、找到文档视图程序框架视图类的OnDraw成员函数,调用DrawLine 函数画出不同斜率情况的直线,如下图:

最后、调试程序直至正确画出直线。 2、给定多边形的顶点的坐标P0(x0,y0),P1(x1,y1),P2(x2,y2),P3(x3,y3),P4(x4,y4)…使用边标志算法或有效边表算法进行多边形填充。 实验基本步骤 首先、使用MFC AppWizard(exe)向导生成一个单文档视图程序框架。 其次、实现边标志算法或有效边表算法函数,如下: void FillPolygon(CDC *pDC, int px[], int py[], int ptnumb); px:该数组用来表示每个顶点的x坐标 py :该数组用来表示每个顶点的y坐标 ptnumb:表示顶点个数 注意实现函数FillPolygon可以直接通过窗口的DC(设备描述符)来进行多边形填充,不需要使用帧缓冲存储。(边标志算法)首先用画线函数勾画出多边形,再针对每条扫描线,从左至右依次判断当前像素的颜色是否勾画的边界色,是就开始填充后面的像素直至再碰到边界像素。注意对顶点要做特殊处理。 通过调用GDI画点函数SetPixel来画出填充过程中的每个点。需要画线可以使用CDC的画线函数MoveTo和LineTo进行绘制,也可以使用实验一实现的画直线函数。 CPoint MoveTo(int x, int y ); BOOL LineTo(int x, int y ); 实现边标志算法算法需要获取某个点的当前颜色值,可以使用CDC的成员函数 COLORREF GetPixel(int x, int y ); 再次、找到文档视图程序框架视图类的OnDraw成员函数,调用FillPolygon 函数画出填充的多边形,如下: void CTestView::OnDraw(CDC* pDC) { CTestcoodtransDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);

计算机图形学课程参考文献

《计算机图形学》课程参考文献 [1 Kenneth R. Castleman, “Digital Image Processing”, Prentice-Hall International,Inc, 1996 [2] James Sharman. The Marching Cubes Algorithm[EB]. https://www.sodocs.net/doc/e98385463.html,/. [3] William E. Lorensen, Harvey E. Cline. Marching Cubes: A High Resolution 3D Surface Construction Algrorithm[J].Computer Graphics, 1987, 21(4). [4] Jan Horn. Metaballs程序[CP]. http://www.sulaco.co.za. [5] 唐泽圣,等.三维数据场可视化[M].北京:清华大学出版社,1999.177-179. [6] 白燕斌,史惠康,等.OpenGL三维图形库编程指南[M].北京:机械工业出版社,1998. [7] 费广正,芦丽丹,陈立新.可视化OpenGL程序设计[M].北京:清华大学出版社,2001. [8] 田捷,包尚联,周明全.医学影像处理与分析[M].北京:电子工业出版社,2003. [9] 三维表面模型的重构、化简、压缩及其在计算机骨科手术模拟中的应用[R]. https://www.sodocs.net/doc/e98385463.html,/~yike/uthesis.pdf ; [10] 首套中国数字化可视人体二维图像[DB]. http://www.chinesevisiblehuman. com/ pic/pictype.asp [11] 季雪岗,王晓辉,张宏林,等.Delphi编程疑难详解[M].北京:人民邮电出版社,2000. [12] 郑启华.PASCAL程序设计(第二版)[M].北京:清华大学出版社,1996. [13] 涂晓斌,谢平,陈海雷,蒋先刚.实用微机工程绘图实验教程[M].西南交通大学出版社,2004,4. [14] David F.Rogers.计算机图形学算法基础[M].北京:电子工业出版社,2002. [15] 李信真,车刚明,欧阳洁,封建湖.计算方法[M].西安:西北工业大学出版社,2000. [16] Paul Bourke Polygonising a scalar field [CP]. http://astronomy. https://www.sodocs.net/doc/e98385463.html,.au/ ~pbourke/ modelling/polygonise/ [17] 刘骏.Delphi数字图像处理及高级应用[M].北京:科学出版社,2003. [18] 李弼程,彭天强,彭波,等.智能图像处理技术[M].北京:电子工业出版社,2004. [19] Kenneth R.Castleman著,朱志刚,石定机,等译.数字图像处理[M].北京:电子工业出版社,2002. [20] Milan Sonka, Vaclav Hlavac, Roger Boyle.Image Processing, Analysis, and Machine Vision [M].北京:人民邮电出版社,2003. [21] 阮秋奇.数字图像处理学[M]. 北京:电子工业出版社, 2001. [22] 刘宏昆,等.Delphi应用技巧与常见问题[M]. 北京:机械工业出版社, 2003. [23] 张增强,李鲲程,等.专家门诊—Delphi开发答疑300问[M].北京:人民邮电出版社,2003.6.

《计算机图形学》 课程实验指导(1)

《计算机图形学》课程实验指导 一.实验总体方案 1.教学目标与基本要求 (1)掌握教材所介绍的图形算法的原理; (2)掌握通过具体的平台实现图形算法的方法,培养相应能力; (3)通过实验培养具有开发一个基本图形软件包的能力。 2. 实验平台与考核 实验主要结合OpenGL设计程序实现各种课堂教学中讲过的图形算法为主。程序设计语言主要以C/C++语言为主,开发平台为Visual C++。 每次实验前完成实验报告的实验目的、实验内容、实验原理、实验代码四部分并接受抽查,实验完成后完成实验结果、实验体会两部分,本次实验课结束前提交。 3. 实验步骤 (1) 预习教材与实验指导相关的算法理论及原理; (2) 仿照教材与实验指导提供的算法,利用VC+OpenGL进行实现; (3) 调试、编译、运行程序,运行通过后,可考虑对程序进行修改或改进。 二. 实验具体方案 实验预备知识 OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性。 1)与C语言紧密结合: OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的。如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL 作图甚至比TC更加简单; 2)强大的可移植性: 微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统。而OpenGL 不仅用于 Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。并且,OpenGL 的基本命令都做到了硬件无关,甚至是平台无关; 3) 高性能的图形渲染: OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先。 总之,OpenGL是一个非常优秀的图形软件接口。OpenGL官方网站(英文)https://www.sodocs.net/doc/e98385463.html, 下面将对Windows下的OpenGL编程进行简单介绍。如下是学习OpenGL前的准备工作:1.选择一个编译环境 现在Windows系统的主流编译环境有Visual C++,C++ Builder,Dev-C++等,它们都是支持OpenGL的。但这里我们选择Visual C++ 作为学习OpenGL的实验环境。 2.安装GLUT工具包 GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。Windows环境下的GLUT下载地址:(大小约为150k) https://www.sodocs.net/doc/e98385463.html,/resources/libraries/glut/glutdlls37beta.zip Windows环境下安装GLUT的步骤: 1)将下载的压缩包解开,将得到5个文件 2)在“我的电脑”中搜索“gl.h”,并找到其所在文件夹(如果是VisualStudio2005,则

计算机硬件实验指导书模板

第一部分EL实验系统的结构 EL-l微机实验教学系统由功能实验板、可选的CPU板、二块小面包板三部分构成, 可安装在45*30*10cm的实验箱内。总框图如下: 面包板: 1)通用面包板 2)金属圆孔组成的通用实验板 CPU板: 1)8086 PC总线板 2)8086 CPU板 3)8051 CPU板 4)8098 CPU板 5)80C198 CPU板 功能实验板: 由若干相对独立的功能接口电路组成, 它们是: D/A电路、A/D电路、发光二极管电路、开关量输入电路、RAM/ROM电路、简单I/O电路、8253可编程定时器/计数器电路、8255并行接口电路、总线驱动电路、8279接口电路、单脉冲发生器、LED显示电路、键盘电路、复位电路、8250串行接口电路。 ( 一) 功能实验板结构

1、输出显示电路 1)数码显示电路。 该电路由6位共阴极数码管, 3片75452, 2片74SL07组成, 74LS07为段驱动器, 相应输入插孔为CZ4。75452为位驱动器, 相应输入插控为CZ3(LD1, LD2, LD3, LD4, LD5, LD6)。 2)LED灯显示电路。 该电路由2片74LS04, 12只发光二极管( 红、绿、黄各4只) 组成。12只二极管相应的输人插孔为CZ2(LI1, LI2, LI3, LI4, LI5, LI6, LI7, LI8, LI9, LI10, LIl1, LIl2) 2、信号发生电路 1)开关量输入电路: 该电路由8只开关组成, 每只开关有两个位置, 一个位置代表高电平, 一个位置代表低电平。该电路的输出插孔为CZl(Kl, K2, K3, K4, K5, K6, K7, K8)。 2)时钟输入电路: 该电路由1片74LSl6l组成: ·当CPU为PC总线时, 输入时钟为AT总线的CLK, ·当CPU为805l、8098、80C198时, CLK的输入时钟为晶振频率, ·当CPU为8086时, CLK是2MHz。 输出时钟为该CLK的2分频(CLK0), 4分频(CLKI), 8分频(CLK2), 16分频(CLK3), 相应输出插孔CZ47(CLK0, CLKl, CLK2,

计算机图形学实验C++代码

一、bresenham算法画直线 #include #include #include void draw_pixel(int ix,int iy) { glBegin(GL_POINTS); glVertex2i(ix,iy); glEnd(); } void Bresenham(int x1,int y1,int xEnd,int yEnd) { int dx=abs(xEnd-x1),dy=abs(yEnd-y1); int p=2*dy-dx; int twoDy=2*dy,twoDyMinusDx=2*dy-2*dx; int x,y; if (x1>xEnd) { x=xEnd;y=yEnd; xEnd=x1; } else { x=x1; y=y1; } draw_pixel(x,y); while(x

} void myinit() { glClearColor(0.8,1.0,1.0,1.0); glColor3f(0.0,0.0,1.0); glPointSize(1.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0,500.0,0.0,500.0); } void main(int argc,char **argv ) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(500,500); glutInitWindowPosition(200.0,200.0); glutCreateWindow("CG_test_Bresenham_Line example"); glutDisplayFunc(display); myinit(); glutMainLoop(); } 二、中点法绘制椭圆 #include #include #include inline int round(const float a){return int (a+0.5);} void setPixel(GLint xCoord,GLint yCoord) { glBegin(GL_POINTS); glVertex2i(xCoord,yCoord); glEnd(); } void ellipseMidpoint(int xCenter,int yCenter,int Rx,int Ry) { int Rx2=Rx*Rx; int Ry2=Ry*Ry; int twoRx2=2*Rx2; int twoRy2=2*Ry2; int p; int x=0; int y=Ry; int px=0; int py=twoRx2*y; void ellipsePlotPoints(int,int,int,int);

一种基于计算几何方法的最小包容圆求解算法.kdh

2007年 工 程 图 学 学 报2007 第3期 JOURNAL OF ENGINEERING GRAPHICS No.3一种基于计算几何方法的最小包容圆求解算法 张 勇, 陈 强 (清华大学机械工程系先进成形制造重点实验室,北京 100084) 摘要:为实现点集最小包容圆(最小外接圆)的求解,将计算几何中的α-壳的概 念应用到最小包容圆的计算过程,提出了一种精确有效的最小包容圆求解算法。根据α-壳定 义及最小包容圆性质,证明当1/α等于最小包容圆半径时点集的α-壳顶点共圆,1/α小于最小 包容圆半径时α-壳不存在,1/α大于最小包容圆半径时随着1/α减小α-壳顶点数逐渐减小的规 律。将α-壳顶点数目作为搜索最小包容圆半径的依据,实现了最小包容圆半径的搜索和最小包容圆的求解。 关键词:计算机应用;优化算法;计算几何;最小包容圆;α-壳 中图分类号:TP 391 文献标识码:A 文章编号:1003-0158(2007)03-0097-05 Algorithm for Minimum Circumscribed Circle Detection Based on Computational Geometry Technique ZHANG Yong, CHEN Qiang ( Key Laboratory for Advanced Manufacturing by Materials Processing Technology, Department of Mechanical Engineering, Tsinghua University, Beijing 100084, China ) Abstract: α-hulls are applied to calculate the minimum circumscribed circle (MCC) of point set and an accurate and effective method for MCC detection is established through finding the least squares circle of the point set and iteratively approaching the MCC with recursive subdivision. Several theorems concerning the properties of α-hulls are presented. If 1/α is equal to the radius of points’ MCC, all vertices of the α-hull will be on the same circle. When 1/α is larger than the MCC’s radius, the number of vertices of α-hulls will decrease with decreasing of 1/α, and the number of vertices’ number will reach zero when 1/α is smaller than MCC’s radius. From the above rules, an algorithm for detecting MCC is developed, and experimental results show this algorithm is reliable. Key words: computer application; optimized algorithm; computational geometry; minimum circumscribed circle; α-hull 收稿日期:2005-12-20 基金项目:国家自然科学基金资助项目(50275083);高校博士点基金资助项目(20020003053)

计算机图形学实验报告

.

目录

实验一直线的DDA算法 一、【实验目的】 1.掌握DDA算法的基本原理。 2.掌握DDA直线扫描转换算法。 3.深入了解直线扫描转换的编程思想。 二、【实验内容】 1.利用DDA的算法原理,编程实现对直线的扫描转换。 2.加强对DDA算法的理解和掌握。 三、【测试数据及其结果】 四、【实验源代码】 #include

#include #include #include GLsizei winWidth=500; GLsizei winHeight=500; void Initial(void) { glClearColor(1.0f,1.0f,1.0f,1.0f); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150.0); } void DDALine(int x0,int y0,int x1,int y1) { glColor3f(1.0,0.0,0.0); int dx,dy,epsl,k; float x,y,xIncre,yIncre; dx=x1-x0; dy=y1-y0; x=x0; y=y0; if(abs(dx)>abs(dy)) epsl=abs(dx); else epsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { glPointSize(3); glBegin(GL_POINTS); glV ertex2i(int(x+0.5),(int)(y+0.5)); glEnd(); x+=xIncre; y+=yIncre; } } void Display(void) { glClear(GL_COLOR_BUFFER_BIT); DDALine(100,100,200,180); glFlush(); }

计算机组成原理实验指导书

计算机组成原理实验指导书适用TD-CMA实验设备

实验一基本运算器实验 一、实验原理 运算器内部含有三个独立运算部件,分别为算术、逻辑和移位运算部件,要处理的数据存于暂存器A和暂存器B,三个部件同时接受来自A和B的数据(有些处理器体系结构把移位运算器放于算术和逻辑运算部件之前,如ARM),各部件对操作数进行何种运算由控制信号S3 0 CN来决定,任何时候,多路选择开关只选择三部件中一个部件的结果作为ALU的输出。如果是影响进位的运算,还将置进位标志FC,在运算结果输出前,置ALU零标志。ALU中所有模块集成在一片CPLD中。 逻辑运算部件由逻辑门构成,较为简单,而后面又有专门的算术运算部件设计实验,在此对这两个部件不再赘述。移位运算采用的是桶形移位器,一般采用交叉开关矩阵来实现,交叉开关的原理如图1-1-2所示。图中显示的是一个4X4的矩阵(系统中是一个8X8的矩阵)。每一个输入都通过开关与一个输出相连,把沿对角线的开关导通,就可实现移位功能,即: (1) 对于逻辑左移或逻辑右移功能,将一条对角线的开关导通,这将所有的输入位与所使用的输出分别相连,而没有同任何输入相连的则输出连接0。 (2) 对于循环右移功能,右移对角线同互补的左移对角线一起激活。例如,在4位矩阵中使用‘右1’和‘左3’对角线来实现右循环1位。 (3) 对于未连接的输出位,移位时使用符号扩展或是0填充,具体由相应的指令控制。使用另外的逻辑进行移位总量译码和符号判别。 原理如图1-1-1所示

图1-1-1 运算器原理图 运算器内部含有三个独立运算部件,分别为算术、逻辑和移位运算部件,要处理的数据存于暂存器A和暂存器B,三个部件同时接受来自A和B的数据(有些处理器体系结构把移位运算器放于算术和逻辑运算部件之前,如ARM),各部件对操作数进行何种运算由控制信号S3 0 决定,任何时候,多路选择开关只选择三部件中一个部件的结果作为ALU的输出。如果是算术运算,还将置进位标志FC,在运算结果输出前,置ALU零标志。ALU中所有模块集成在一片CPLD(MAXII EPM240)中。 逻辑运算部件由逻辑门构成,较为简单,而后面又有专门的算术运算部件设计实验,在此对这两个部件不再赘述。移位运算采用的是桶形移位器,一般采用交叉开关矩阵来实现,交叉开关的原理如图1-1-2所示。图中显示的是一个4X4的矩阵(系统中是一个8X8的矩阵)。每一个输入都通过开关与一个输出相连,把沿对角线的开关导通,就可实现移位功能,即:

相关主题