计算机图形学实验报告

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

《计算机图形学》实验报告姓名:郭子玉

学号: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

D=dy-2*dx

y

绘点

D<0

D = D - 2*dx; y=y+1;

x=x+1;D = D + 2*dy -

2*dx; y=y+1;

结束

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;

}

int x;

float y;

x = (int)X0;

y = (float)Y0;

while(x <= X1)

{

DrawPixel(x, round(y));

x ++;

y = y + k;

}

}

else

{

if(Y0 > Y1)

{

int temp = Y0;

Y0 = Y1;

Y1 = temp;

}

float x;

int y;

x = (float)X0;

y = (int)Y0;

while(y <= Y1)

{

DrawPixel(round(x), y);

y ++;

x = x + 1/k;

}

}

return;

}

(2)Mid_Bresenham算法

void CExperiment_Frame_OneView::Mid_Bresenham(int X0, int Y0, int X1, int Y1)

{

//-------请实现Mid_Bresenham算法-------//

int D;

int dx, dy;

int x, y;

dx = X1 - X0;

dy = Y1 - Y0;

x = X0;

y = Y0;

if(dx > dy)

{

while(x <= X1)

{

DrawPixel(x, y);

if(D < 0)

{

y = y +1;

D = D + 2*dx - 2*dy;

}

else

{

D = D - 2*dy;

}

x++;

}

}

else

{

D = dy - 2*dx;

while(y <= Y1)

{

DrawPixel(x, y);

if(D < 0)

{

D = D + 2*dy - 2*dx;

}

else

{

D = D - 2*dx;

}

y++;

}

}

return;

}

3.3运行结果

(1)DDA算法

(2)Mid_Bresenham算法

3.4运行结果分析

DDA算法直观,实现简单。但是涉及浮点数运算,不利于硬件实现。Mid_Bresenham算法比DDA算法简单。两种算法实现生成的直线也可能会有不同。

4实验心得

通过实验,学习掌握了两种直线的扫描转换算法。不同方法有不同的优点,实现结果也有可能不同。需要通过比较,确定哪种方法更优,更符合正确结果。

实验二

1 实验目的和要求

理解多边形扫描转换的原理;掌握典型多边形扫描转换算法;掌握步处理、分析实验数据的能力;

编程实现基本X-扫描线转换算法(必做);

2 实验环境和工具

开发环境:Visual C++ 6.0

实验平台:Polygon_Conversion (自制平台)

3 实验结果

3.1 程序流程图 X-扫描线转换算法

是 否

开始

计算xmax,ymax

扫描线与各线段是否有交点

交点是否为线段的第一个顶点

判断不同类型的顶点,记录

根据公式求交点,记录

x 排序

绘点

3.2 程序代码

/************************************************* ********************

功能:X-扫描线转换算法

参数说明:

vertices[][2]---顶点列表

VertexNum ---顶点数目

备注:

DrawPixel(int x, int y) --绘制像素点(x, y)

************************************************** ********************/

void

CPolygon_ConversionView::X_Scan_Line_Conersion(int Vertices[][2], int VertexNum)

{

int ymax, ymin,count;

float k;

ymax=Vertices[0][1];

ymin=Vertices[0][1];

for(int p =0 ; p < VertexNum; p++){ //

求y的最高点和最低点

if(Vertices[p][1] > ymax) ymax=Vertices[p][1];

if(Vertices[p][1] < ymin) ymin=Vertices[p][1];

}

int Xn[100], i, ymax2, ymin2, temp;

for( i = ymin ; i <= ymax ; i++){ //求交点

count=0;

for( int j = 0; j < VertexNum; j++)

{

if(j == (VertexNum-1) ){ //最后一个点和第一个点的线段

if(Vertices[j][1] > Vertices[0][1]){ //线段的y最大值与最小值

ymax2=Vertices[j][1];

ymin2=Vertices[0][1];

}

else{

ymax2=Vertices[0][1];

ymin2=Vertices[j][1];

}

if((iymin2)){ //判断交点是否在线段上

k= (float) ( (float)(Vertices[j][0]-Vertices[0][0]) / (float)(Vertices[j][1]-Vertices[0][1]) );

Xn[count]=(int) ( (k * (float)i - k *(float) Vertices[0][1] + (float)Vertices[0][0]) + 0.5);

count++;

}

else if( i == Vertices[j][1] ){ //扫描线经过线段顶点,只算前一个顶点

if( (Vertices[j-1][1] > i) && (Vertices[0][1] > i)){

Xn[count]=Vertices[j][0];

count++;

Xn[count]=Vertices[j][0];

count++;

}

else if( ((Vertices[j-1][1] < i) && (Vertices[0][1] > i)) || ((Vertices[j-1][1] > i) && (Vertices[0][1] < i)) ) {

Xn[count]=Vertices[j][0];

count++;

}

}

}

else{ //其他线段交点

if(Vertices[j][1] > Vertices[j+1][1]){

ymax2=Vertices[j][1];

ymin2=Vertices[j+1][1];

}

else{

ymax2=Vertices[j+1][1];

ymin2=Vertices[j][1];

}

if((iymin2)){

k= (float) ( (float) (Vertices[j][0]-Vertices[j+1][0]) / (float) (Vertices[j][1]-Vertices[j+1][1]) );

Xn[count]=(int) ( (k *(float) i - k * (float)Vertices[j+1][1] + Vertices[j+1][0]) + 0.5);

count++;

}

else if( i == Vertices[j][1] ){ //扫描线经过线段顶点,只算前一个顶点

if(j != 0){ //交点不为第一和最后一点

if( (Vertices[j-1][1] > i) && (Vertices[j+1][1] > i)){

Xn[count]=Vertices[j][0];

count++;

Xn[count]=Vertices[j][0];

count++;

}

else if( ((Vertices[j-1][1] < i) && (Vertices[j+1][1] > i)) || ((Vertices[j-1][1] > i) && (Vertices[j+1][1] < i)) ){

Xn[count]=Vertices[j][0];

count++;

}

else{}

}

else

{

//交点为第一点

if( (Vertices[VertexNum-1][1] > i) && (Vertices[j+1][1] > i)){

Xn[count]=Vertices[j][0];

count++;

Xn[count]=Vertices[j][0];

count++;

}

else if( ((Vertices[VertexNum-1][1] < i) && (Vertices[j+1][1] > i)) || ((Vertices[VertexNum-1][1] > i) && (Vertices[j+1][1] < i)) ) {

Xn[count]=Vertices[j][0];

count++;

}

}

}

}

}

for( int m = 0; m < count-1; m++ ){ //交点x坐标排序

for( int n = m+1; n < count; n++ ){

if( Xn[m] > Xn[n] ){

temp=Xn[m];

Xn[m]=Xn[n];

Xn[n]=temp;

}

}

}

for( int a = 0; a < count; a+=2 ){ //绘制像素点for( int b = Xn[a]; b < Xn[a+1]; b++){

DrawPixel(b, i);

}

}

}

return;

}

3.3 运行结果

3.4 运行结果分析

从运行结果看可以实现任意多边形的区域填充。

4 实验心得

通过这个实验,学习掌握了X-扫描线转换算法,实现了区域填充。编写算法过程中,不断改进算法,在同学帮助下解决困难。但是还有改进的有效边表算法没有去编写实现,程序在不断改进中不断优化,我们也可以从中学到许多知识。

计算机图形学作业

计算机图形学第一次作业 计算机X班XXX 1XXX010XXX 1.你是否想用图形学的有关知识去解决一两个实际问题?你想解决的问题是什么?考虑如何解决? 答:我希望可以解决的有设计汽车外壳和制作动画。 解决方法:(1)汽车外壳 使用3D MAX/AutoCAD软件进行设计。 (2)制作动画 利用动画制作软件(3D MAX)在计算机上制作动画 2.某彩色图形显示系统,CRT显示器的分辨率为1024×1024,它可以从2^17次方种颜色中选择出2^15次方来显示,其帧缓冲器的容量应该如何计算?查色表的长度和宽度应为多少? 解:16b==2B 因为分辨率为1024x1024 所以1024*1024*2B=2MB 3.采用Bresenham画线算法,绘出起点(1,3),终点为(9,18)的直线段。 解: void DrawBresenhamline(int x0, int y0, int x1, int y1) { int dx = x1 - x0;//x偏移量 int dy = y1 - y0;//y偏移量 int ux = dx >0 ?1:-1;//x伸展方向 int uy = dx >0 ?1:-1;//y伸展方向 int dx2 = dx <<1;//x偏移量乘2 int dy2 = dy <<1;//y偏移量乘2 if(abs(dx)>abs(dy)) {//以x为增量方向计算 int e = -dx; //e = -0.5 * 2 * dx,把e 用2 * dx* e替换 int x = x0;//起点x坐标 int y = y0;//起点y坐标 for (x = x0; x < x1;x+=ux) { printf ("%d,%d\n",x, y); e=e + dy2;//来自2*e*dx= 2*e*dx + 2dy (原来是e = e + k) if (e > 0)//e是整数且大于0时表示要取右上的点(否则是右下的点) { y += uy; e= e - dx2;//2*e*dx = 2*e*dx - 2*dx (原来是e = e -1) } } } else {//以y为增量方向计算

计算机图形学期末大作业3D建模

深圳大学实验报告 课程名称:计算图形学 实验名称:3D建模和真实感图形绘制 学院:计算机与软件学院专业:计算机科学与技术报告人:学号:2012150 班级: 1 同组人:无 指导教师:周虹 实验时间:2014年11、12月 实验报告提交时间:2014/12/28 教务处制

一.实验目的 1、使用OpenGL创建和动画你自己设计的角色。 2、熟悉3D层次建模和转换。 二.实验步骤 1、打开VC6.0打开工作空间modeler.dsw, 可以看到工程的所有工程都包含进来了。找到sample.cpp并打开。 2、找到sample.cpp中的draw函数,在这个函数中绘制图形。首先,在一对glPushMatrix()和glPopMatrix()之间用glTranslated函数确定绘制图形坐标系的原点(以下图形的绘制均用到这对函数,后面不再赘述)。然后用三角形绘制平行四边形的地板,用

setDiffuseColor函数设定不同的颜色参数。 主要代码如下: 2、为模型绘制背景,即三角旋转阶梯。同样的,用三角形绘制,使得整个画面看起来像舞台般宽敞华丽。

截断): 拼接柱子,并且颜色设置成黄白相间,使气氛柔和淡雅。

4、柱子一般都有柱台的。此处用长方体作为柱台,大气得体。颜色选择淡蓝色,正好跟柱子的颜色相辉映。 主要代码如下:

5、俗话说好事成双。在同一个层次中,我再绘制了同样的柱子和柱台,使画面呈现对称美。 6、柱子是空心的,得给它加个“盖子”。为了统一柱子的结构,此处依然用三角形拼接柱子的尖顶,尖顶作为柱子的下一个层次。如图:

计算机图形学实验一

实验一二维基本图元的生成与填充 实验目的 1.了解并掌握二维基本图元的生成算法与填充算法。 2.实现直线生成的DDA算法、中点算法和Bresenham算法。 3.实现圆和椭圆生成的DDA和中点算法, 对几种算法的优缺点有感性认识。 二.实验内容和要求 1.选择自己熟悉的任何编程语言, 建议使用VC++。 2.创建良好的用户界面,包括菜单,参数输入区域和图形显示区域。 3.实现生成直线的DDA算法、中点算法和Bresenham算法。 4.实现圆弧生成的中点算法。 5.实现多边形生成的常用算法, 如扫描线算法,边缘填充算法。 6.实现一般连通区域的基于扫描线的种子填充算法。 7.将生成算法以菜单或按钮形式集成到用户界面上。 8.直线与圆的坐标参数可以用鼠标或键盘输入。 6. 可以实现任何情形的直线和圆的生成。 实验报告 1.用户界面的设计思想和框图。 2.各种实现算法的算法思想。 3.算法验证例子。 4.上交源程序。 直线生成程序设计的步骤如下: 为编程实现上述算法,本程序利用最基本的绘制元素(如点、直线等),绘制图形。如图1-1所示,为程序运行主界面,通过选择菜单及下拉菜单的各功能项分别完成各种对应算法的图形绘制。 图1-1 基本图形生成的程序运行界面 2.创建工程名称为“基本图形的生成”单文档应用程序框架 (1)启动VC,选择“文件”|“新建”菜单命令,并在弹出的新建对话框中单击“工程”标签。 (2)选择MFC AppWizard(exe),在“工程名称”编辑框中输入“基本图形的生成”作为工程名称,单击“确定”按钮,出现Step 1对话框。 (3)选择“单个文档”选项,单击“下一个”按钮,出现Step 2对话框。 (4)接受默认选项,单击“下一个”按钮,在出现的Step 3~Step 5对话框中,接受默认选项,单击“下一个”按钮。

计算机图形学实验

实验1 直线的绘制 实验目的 1、通过实验,进一步理解和掌握DDA和Bresenham算法; 2、掌握以上算法生成直线段的基本过程; 3、通过编程,会在TC环境下完成用DDA或中点算法实现直线段的绘制。实验环境 计算机、Turbo C或其他C语言程序设计环境 实验学时 2学时,必做实验。 实验内容 用DDA算法或Besenham算法实现斜率k在0和1之间的直线段的绘制。 实验步骤 1、算法、原理清晰,有详细的设计步骤; 2、依据算法、步骤或程序流程图,用C语言编写源程序; 3、编辑源程序并进行调试; 4、进行运行测试,并结合情况进行调整; 5、对运行结果进行保存与分析; 6、把源程序以文件的形式提交; 7、按格式书写实验报告。 实验代码:DDA: # include # include

void DDALine(int x0,int y0,int x1,int y1,int color) { 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++) { putpixel((int)(x+0.5),(int)(y+0.5),4); x+=xIncre; y+=yIncre; } } main(){ int gdriver ,gmode ;

计算机图形学作业-Display-答案分析

计算机图形学作业I 一.判断题 1.齐次坐标提供了坐标系变换的有效方法,但仍然无法表示无穷远的点;(×) 2.若要对某点进行比例、旋转变换,首先需要将坐标原点平移至该点,在新的坐标系下做比例或旋转变换,然后在将原点平移回去;(√) 3. 相似变换是刚体变换加上等比缩放变换;(√) 4. 保距变换是刚体变换加上镜面反射;(√) 5. 射影变换保持直线性,但不保持平行性。(√) 二、填空题 1.透视投影的视见体为截头四棱锥形状;平行投影的视见体为长方体形状。 2.字符的图形表示可以分为矢量表示和点阵表示两种形式。 3.仿射变换保持直线的平行性 4.刚体变换保持长度 5.保角变换保持向量的角度 三、单项选择题 1. 分辨率为1024×1024的显示器各需要多少字节位平面数为24的帧缓存?( D) A. 512KB; B. 1MB; C. 2MB; D. 3MB ; 2. 在透视投影中,主灭点的最多个数是( C ) A 1; B 2; C 3; D 4 3. 以下关于图形变换的论述不正确的是( B ) A. 平移变换不改变图形大小和形状,只改变图形位置; B. 拓扑关系不变的几何变换不改变图形的连接关系和平行关系; C.旋转变换后各图形部分间的线性关系和角度关系不变,变换后直线的长度不变 D.错切变换虽然可引起图形角度的改变,但不会发生图形畸变; 4. 使用下列二维图形变换矩阵:将产生变换的结果为( D ) A. 图形放大2倍; B. 图形放大2倍,同时沿X、Y1个绘图单位; C.沿X坐标轴方向各移动2个绘图单位; D.沿X坐标轴方向放大2倍,同时沿X、Y坐标轴方向各平移1个绘图单位。 5. 下列有关投影的叙述语句中,正确的论述为(B ) A. 透视投影具有近小远大的特点; B. 平行投影的投影中心到投影面距离是无限的; C. 透视投影变换中,一组平行于投影面的线的投影产生一个灭点; T =

《数字图像处理》复习大作业及答案

2014年上学期《数字图像处理》复习大作业及参考答案 ===================================================== 一、选择题(共20题) 1、采用幂次变换进行灰度变换时,当幂次取大于1时,该变换是针对如下哪一类图像进行增 强。(B) A 图像整体偏暗 B 图像整体偏亮 C图像细节淹没在暗背景中D图像同时存在过亮和过暗背景 2、图像灰度方差说明了图像哪一个属性。(B ) A 平均灰度 B 图像对比度 C 图像整体亮度D图像细节 3、计算机显示器主要采用哪一种彩色模型( A ) A、RGB B、CMY或CMYK C、HSI D、HSV 4、采用模板[-1 1]T主要检测( A )方向的边缘。 A.水平 B.45? C.垂直 D.135? 5、下列算法中属于图象锐化处理的是:( C ) A.低通滤波 B.加权平均法 C.高通滤波 D. 中值滤波 6、维纳滤波器通常用于( C ) A、去噪 B、减小图像动态范围 C、复原图像 D、平滑图像 7、彩色图像增强时, C 处理可以采用RGB彩色模型。 A. 直方图均衡化 B. 同态滤波 C. 加权均值滤波 D. 中值滤波 8、__B__滤波器在对图像复原过程中需要计算噪声功率谱和图像功率谱。 A. 逆滤波 B. 维纳滤波 C. 约束最小二乘滤波 D. 同态滤波 9、高通滤波后的图像通常较暗,为改善这种情况,将高通滤波器的转移函数加上一常数量以 便引入一些低频分量。这样的滤波器叫B。 A. 巴特沃斯高通滤波器 B. 高频提升滤波器 C. 高频加强滤波器 D. 理想高通滤波器 10、图象与灰度直方图间的对应关系是 B __ A.一一对应 B.多对一 C.一对多 D.都不 11、下列算法中属于图象锐化处理的是:C A.低通滤波 B.加权平均法 C.高通滤 D. 中值滤波 12、一幅256*256的图像,若灰度级数为16,则存储它所需的比特数是:( A ) A、256K B、512K C、1M C、2M 13、噪声有以下某一种特性( D ) A、只含有高频分量 B、其频率总覆盖整个频谱 C、等宽的频率间隔内有相同的能量 D、总有一定的随机性 14. 利用直方图取单阈值方法进行图像分割时:(B) a.图像中应仅有一个目标 b.图像直方图应有两个峰 c.图像中目标和背景应一样大 d. 图像中目标灰度应比背景大 15. 在单变量变换增强中,最容易让人感到图像内容发生变化的是( C )

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

计算机图形学实验 肖加清

实验一图形学实验基础 一、实验目的 (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

计算机图形学作业-Display-答案

计算机图形学作业 I 一.判断题 1.齐次坐标提供了坐标系变换的有效方法,但仍然无法表示无穷远的点;(×) 2.若要对某点进行比例、旋转变换,首先需要将坐标原点平移至该点,在新的坐标系下做比例或旋转变换,然后在将原点平移回去;(√) 3. 相似变换是刚体变换加上等比缩放变换;(√) 4. 保距变换是刚体变换加上镜面反射;(√) 5. 射影变换保持直线性,但不保持平行性。(√) 二、填空题 1.透视投影的视见体为截头四棱锥形状;平行投影的视见体为长方体形状。 2.字符的图形表示可以分为矢量表示和点阵表示两种形式。 3.仿射变换保持直线的平行性 4.刚体变换保持长度 5.保角变换保持向量的角度 三、单项选择题 1. 分辨率为1024×1024的显示器各需要多少字节位平面数为24的帧缓存?( D) A. 512KB; B. 1MB; C. 2MB; D. 3MB ; 2. 在透视投影中,主灭点的最多个数是( C ) A 1; B 2; C 3; D 4 3. 以下关于图形变换的论述不正确的是( B ) A. 平移变换不改变图形大小和形状,只改变图形位置; B. 拓扑关系不变的几何变换不改变图形的连接关系和平行关系; C.旋转变换后各图形部分间的线性关系和角度关系不变,变换后直线的长度不变 D.错切变换虽然可引起图形角度的改变,但不会发生图形畸变; 4. 使用下列二维图形变换矩阵:将产生变换的结果为( D ) A. 图形放大2倍; B. 图形放大2倍,同时沿X、Y1个绘图单位; C.沿X坐标轴方向各移动2个绘图单位; D.沿X坐标轴方向放大2倍,同时沿X、Y坐标轴方向各平移1个绘图单位。 5. 下列有关投影的叙述语句中,正确的论述为(B ) A. 透视投影具有近小远大的特点; B. 平行投影的投影中心到投影面距离是无限的; C. 透视投影变换中,一组平行于投影面的线的投影产生一个灭点; T =

计算机图形学期末编程大作业

完成下列程序的设计、调试与及设计说明书: 一、实现直线、圆的生成 要求:(1)算法不限;(2)直线的端点、圆的圆心、半径由用户实时输入;(3)用所实现的直线、圆的生成程序实现一个任意图形的绘制。 二、实现区域填充(多边形区域)或影线填充 要求:(1)区域自行指定,至少应有一个内环(2)算法:计算机相关专业的要求实现图案填充,机械相关专业的要求实现影线填充。 三、直线段裁剪算法的实现 要求:完成对一个指定图形(见图)的裁剪,先在图形 区显示原始图形及窗口位置,然后将裁剪后图形的显示在图 形区的另一侧。 四、凸多面体消隐的实现(外法线法) 要求:立体数据自定。 五、样条曲线的实现 要求:实现B样条曲线,并能通过交互输入点的形式完成曲 线绘制。 注意:要反求控制点 六、平时成绩(30分) 要求: 1、语言不限,可以是所熟悉的如何一种语言。 2、须提交的内容包括:源程序(电子版)、可执行程序,设计说明书(电子版及打印版)。 3、程序须经教师运行测试通过。 4、设计说明书B5页面打印,内容包括:算法与数据结构,程序流程说明及变量,程序运行情况分析及结果截图,程序使用说明。

题目一:实现直线、圆的生成 要求:(1)算法不限;(2)直线的端点、圆的圆心、半径由用户实时输入;(3)用所实现的直线、圆的生成程序实现一个任意图形的绘制。 1.程序使用说明. 1)概述 该程序以Visual C++6.0作为编程开发工具,利用其中的MFC(Microsoft Foundation Classes)库作为应用程序的框架,进行图形的编程绘制,有良好的用户操作界面和简洁的操作方法。 执行该程序,界面如下图。 图1-1 程序运行界面 图形绘制功能的实现,主要是通过点选菜单栏中的对应菜单项来实现。主要功能有:图形颜色的选择、绘制直线、绘制圆。 2)具体操作说明: a.颜色的选择. 鼠标左键单击菜单项,便会弹出颜色编辑对话框,如图2。

计算机图形学课程设计书

计算机图形学课程设计 书 文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

课程设计(论文)任务书 理学院信息与计算科学专业2015-1班 一、课程设计(论文)题目:图像融合的程序设计 二、课程设计(论文)工作: 自2018 年1 月10 日起至2018 年1 月12日止 三、课程设计(论文) 地点: 2-201 四、课程设计(论文)内容要求: 1.本课程设计的目的 (1)熟悉Delphi7的使用,理论与实际应用相结合,养成良好的程序设计技能;(2)了解并掌握图像融合的各种实现方法,具备初步的独立分析和设计能力;(3)初步掌握开发过程中的问题分析,程序设计,代码编写、测试等基本方法;(4)提高综合运用所学的理论知识和方法独立分析和解决问题的能力; (5)在实践中认识、学习计算机图形学相关知识。 2.课程设计的任务及要求 1)基本要求: (1)研究课程设计任务,并进行程序需求分析; (2)对程序进行总体设计,分解系统功能模块,进行任务分配,以实现分工合作;(3)实现各功能模块代码; (4)程序组装,测试、完善系统。 2)创新要求: 在基本要求达到后,可进行创新设计,如改进界面、增加功能或进行代码优化。

3)课程设计论文编写要求 (1)要按照书稿的规格打印誊写课程设计论文 (2)论文包括封面、设计任务书(含评语)、摘要、目录、设计内容、设计小结(3)论文装订按学校的统一要求完成 4)参考文献: (1)David ,《计算机图形学的算法基础》,机械工业出版社 (2)Steve Cunningham,《计算机图形学》,机械工业出版社 (3) 5)课程设计进度安排 内容天数地点 程序总体设计 1 实验室 软件设计及调试 1 实验室 答辩及撰写报告 1 实验室、图书馆 学生签名: 2018年1月12日 摘要 图像融合是图像处理中重要部分,能够协同利用同一场景的多种传感器图像信息,输出一幅更适合于人类视觉感知或计算机进一步处理与分析的融合图像。它可明显的改善单一传感器的不足,提高结果图像的清晰度及信息包含量,有利于更为准确、更为可靠、更为全面地获取目标或场景的信息。图像融合主要应用于军事国防上、遥感方面、医学图像处理、机器人、安全和监控、生物监测等领域。用于较多也较成熟的是红外和可见光的融合,在一副图像上显示多种信息,突出目标。一般情况下,图像融合由

计算机图形学作业题

计算机图形学作业题 1. 计算机中由图形的形状参数(方程或分析表达式的系数,线段的端点坐标等)加属性参数(颜色、线型等)来表示图形称图形的参数表示;枚举出图形中所有的点称图形的点阵表示,简称为图像(数字图像) 2. 什么是计算机图形学?计算机图形学有哪些研究内容? 3. 计算机图形学有哪些应用领域? 4. 计算机图形学有哪些相关学科分支?它们的相互关系是怎样的? 5. 图形系统的软件系统由哪些软件组成?举例说明。 6. 了解计算机图形系统的硬件。 7. 什么是显示器的分辨率、纵横比、刷新率? 8. 什么是像素、分辨率、颜色数?分辨率、颜色数与显存的关系? 分辨率M ?N 、颜色个数K 与显存大小V 的关系: 例:分辨率为1024像素/行?768行/ 帧,每像素24位(bit )颜色(224种颜色)的显示器,所需的显存为:1024?768?24位(bit )=1024?768?24/8=2359296字节(byte )。或:每像素16777216种颜色(24位真彩色),1024?768的分辨率,所需显存为:1024?768?log 216777216位显存=2359296字节显存。 9. 什么是图元的生成?分别列举两种直线和圆扫描转换算法。 10. OpenGL 由核心库GL(Graphics Library)和实用函数库GLU(Graphics Library Utilities)两个库组成。 11. 区域填充算法要求区域是连通的,因为只有在连通区域中,才可能将种子点的颜色扩展到区域内的其它点。 区域可分为 向连通区域和 向连通区域。区域填充算法有 填充算法和 填充算法。 12. 字符生成有哪两种方式? 点阵式(bitmap fonts 点阵字——raster 光栅方法):采用逐位映射的方式得到字符的点阵和编码——字模位点阵。 笔画式(outline fonts 笔画字——stroke 方法):将字符笔画分解为线段,以线段端点坐标为字符字模的编码。 13. 图形信息包含图形的 和 。 14. 什么是图形变换?图形变换只改变图形的 不改变图形的 。图形变换包括 和 ( )。 15. 熟练掌握二维图形的齐次坐标表示、平移、比例、旋转、对称变换以及复合变换的方法和原则。 16. 图形的几何变换包括 、 、 、 、 ;图形连续作一次以上的几何变换称 变换。 17. 试写出图示多边形绕点A(xo,yo)旋转的变换矩阵。要求写出求解过程及结果。 18. 试写出针对固定参考点、任意方向的比例变换矩阵。 19. 试写出对任意直线y=mx+b 的对称变换矩阵。 20. 什么是窗口?什么是视区?什么是观察变换? 21. 简述二维观察变换的流程。 22. 试述窗口到视区的变换步骤,并推出变换矩阵。 ??—(位) —K N M V 2log ??≥

东南大学自动化学院计算机图形学大作业

计算机图形学大作业 ——程序设计 用简单光照模型显示一系列小球在不同参数情况下的镜面反射效果 学号:08009223 姓名:贺国睿 专业:自动化日期:2012.5.26

1 设计目标和要求 ?用简单光照模型显示一系列小球在不同参数情况下的镜面反射效果; 2 算法原理介绍 2.1光源分析 在现实生活中的物体,要有光照存在才可以被看到。物体通过自身发光以及反射光进入人眼,物体才能在人眼中成像。如果没有任何的光,人眼将观察不到任何东西,一片漆黑。 在光照中首先是光源,要有光源才能产生光线,才有以后的一系列反射、折射、散射等效果。不同的物体的表面物理属性不同,所以相同的光线照射到不同表面属性的物体表面会产生不同的效果,发生漫反射,镜面反射的比例各不相同,有的属于半透明的物体还有折射效果。这些不同的物体表面物理属性属于材质的范畴。 除了材质以外,物体表面还有各种图案效果,这就是纹理。光线在空中穿行的时候,还会有更多复杂的效果。 在现实中,光源的类型很多,而且有的光源不能简单的用一种模型来描述,而是具有多种不同类型光源特点。几种基本的光源类型是:点光源、无穷远光源、方向光源和环境光。 点光源:光线从光源点向四面八方发散,发光的恒星(如太阳)、发光的灯泡一般使用该光源模型模拟,是最简单的光源。 无穷远光源:所有的光线都平行的从一个方向过来,当发光体(如太阳)离渲染的场景很远可以认为是无穷远时,一般使用该光源模型进行模拟。 方向光源:光线沿着一个方向在特定角度范围内逐渐发散开。现实世界中的车灯,手电筒一般使用该光源模型进行模拟。 环境光源:光线从各个地方以各个角度投射到场景中所有物体表面,找不到光源的确切位置。现实世界中不存在这样的光源,一般使用该光源模型来模拟点光源、无穷远光源、方向光源在物体表面经过许多次反射后的情况,环境光源照亮所有物体的所有面。 这四种基本的光源模型,只能近似的描述光源,不可能做到非常逼真。在现实中,一束光线照射到物体表面发生反射后,再照射到另外的物体的表面,如此循环反复这才是环境光的真正情况。这个过程是个无限次反射的过程,计算机无法处理无限的问题,所以采取了简单的近似处理。而且环境光源在反射过程中,上一次反射所带的颜色会影响下次反射所照物体的颜色,并且无限的重复。光线追踪算法是一种好得多的近似描述,但也仅仅是近似描述,只是近似效果比用环境光源模型要好。 OpenGL还提供了让物体自发光让自己可以被看见的方式。这就是物体自发光。物体自发光对于光源十分的重要,比如电灯泡可以看作是一个点光源,我们把点光源的位置设置到灯泡的中央,这样灯泡周围的物体将被照亮,但是灯泡的外表面由于相对光源来说是背面,将不能被照亮。这与实际情况不符合,灯泡照亮其它物体,而自身却不亮,所以需要通过物体自发光让灯泡的外表面也发亮。 光源的一般属性包括:镜面反射光线颜色、漫反射光颜色、环境光线颜色、光源位置。镜面反射光颜色:在物体表面将发生镜面反射的光线的颜色。漫反射光颜色:在物体表面将发生漫反射的光线的颜色。环境光线颜色:照亮所有物体所有表面的光线的颜色。光源位置就是光源在场景中所在的位置。 光线的衰减:光源发出的光线的强度会随着传播距离越来越大而变弱(无穷远光源除外)。光线强度会乘以一个衰减因子。 衰减因子=1/(K1 + K2 * d + k3 *d^2) 其中d为光源距离(无穷远光源的衰减因子为1)方向光源发出的光线会随着偏移中心方向的角度增大而减弱。

计算机图形学实验三报告

计算机科学与通信工程学院 实验报告 课程计算机图形学 实验题目二维图形变换 学生姓名 学号 专业班级 指导教师 日期

成绩评定表

二维图形变换 1. 实验内容 完成对北极星图案的缩放、平移、旋转、对称等二维变换。 提示:首先要建好图示的北极星图案的数据模型(顶点表、边表)。另外,可重复调用“清屏”和“暂停”等函数,使整个变换过程具有动态效果。 2. 实验环境 软硬件运行环境:Windows XP 开发工具:visual studio 2008 3. 问题分析

4. 算法设计 程序框架: //DiamondView.h class CDiamondView : public CView { …… public: //参数输入和提示对话框 void Polaris();//北极星 …… }; //DiamondView.cpp void CDiamondView::OnMenuDiamond() { IsCutting = FALSE; if(dlgDiamond.DoModal()==IDOK) DrawDiamond(dlgDiamond.m_nVertex,dlgDiamond.

m_nRadius,100);//调用绘制金刚石的函数 } //北极星 void CDiamondView::Polaris() {......} 5. 源代码 //北极星 void hzbjx(CDC* pDC,long x[18],long y[18]) { CPen newPen1,*oldPen; newPen1.CreatePen(PS_SOLID,2,RGB(255,0,0)); oldPen = pDC->SelectObject(&newPen1); POINT vertex1[11]={{x[1],y[1]},{x[2],y[2]},{x[3],y[3]},{x[4],y[4]},{x[5],y[5]},{x[3],y[3]},{x[1],y[1]}, {x[6],y[6]},{x[3],y[3]},{x[7],y[7]},{x[5],y[5]}}; pDC->Polyline(vertex1, 11); newPen1.DeleteObject(); newPen1.CreatePen(PS_SOLID, 2, RGB(0,255,0)); oldPen = pDC->SelectObject(&newPen1); POINT vertex2[5]={{x[6],y[6]},{x[8],y[8]},{x[9],y[9]},{x[3],y[3]},{x[8],y[8]}}; pDC->Polyline(vertex2, 5); POINT vertex3[5]={{x[4],y[4]},{x[10],y[10]},{x[11],y[11]},{x[3],y[3]},{x[10],y[10]}}; pDC->Polyline(vertex3, 5);

计算机图形学 课程设计作品

《计算机图形学Visual c++版》考试作业报告 题目:计算机图形学图形画板 专业:推荐IT学长淘宝日用品店530213 班级:推荐IT学长淘宝日用品店530213 学号:推荐IT学长淘宝日用品店530213 姓名:推荐IT学长淘宝日用品店530213 指导教师:推荐IT学长淘宝日用品店530213 完成日期: 2015年12月2日

一、课程设计目的 本课程设计的目标就是要达到理论与实际应用相结合,提高学生设计图形及编写大型程序的能力,并培养基本的、良好的计算机图形学的技能。 设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握计算机图形学基本知识和算法设计的基本技能术,掌握分析、解决实际问题的能力。 通过这次设计,要求在加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。 二、设计内容推荐IT学长淘宝日用品店530213 设计一个图形画板,在这个图形画板中要实现: 1,画线功能,而且画的线要具备反走样功能。 2, 利用上面的画线功能实现画矩形,椭圆,多边形,并且可以对这些图形进行填充。 3,可以对选中区域的图形放大,缩小,平移,旋转等功能。 三、设计过程 程序预处理:包括头文件的加载,常量的定义以及全局变量的定义 #include "stdafx.h" #include "GraDesign.h" #include "GraDesignDoc.h" #include "GraDesignView.h" #include "math.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //******自定义全局变量 int type = -1; CPoint point1; CPoint point2; CPoint temp[2];

计算机图形学作业题

1、已知一直线段起点(0,0),终点(8,6),利用Bresenham算法生成此直线段,写出 生成过程中坐标点及决策变量d的变化情况,并在二维坐标系中,标出直线上各点。 2、试用中点画圆算法原理推导第一象限中y=0到x=y半径为R的圆弧段的扫描转换算法。(要求写清原理、误差函数和递推公式,并进行优化) 3、如下图所示多边形,若采用扫描线算法进行填充,试写出该多边形的ET表和当扫描线Y=3时的有效边表(AET表)。 4、试按左下右上顺序用四向算法,分析当S1为种子时,下图区域的填充过程。 5、将下图中的多边形ABCD先关于点C(3,4)整体放大2倍,再绕点D(5,3)顺时针旋转90 ,试推导其变换矩阵、计算变换后的图形各顶点的坐标,并画出变换后的图形。

6、已知三角形ABC 各顶点的坐标A(3,2)、B(5,5)、C(4,5),相对直线P 1P 2(线段的坐标分别为:P 1 (-3,-2) 、P 2 (8,3) )做对称变换后到达A ’、B ’、C ’。 试计算A ’、B ’、C ’的坐标值。(要求用齐次坐标进行变换,列出变换矩阵,列出计算式子,不要求计算结果) 7、试作出下图中三维形体ABCDE 的三视图。要求写清变换过程,并画出生成的三视图。 x 8、试采用Sutherland –Cohen 裁剪算法,叙述裁剪如下图所示的直线AB 和CD 的步骤: ① 写出端点A 、B 、C 、D 的编码; ② 写出裁剪原理和直线AB 、CD 的裁剪过程。 A B C D 9 、用梁友栋算法裁减如下图线段AB ,A 、B 点的坐标分别为(3,3)、(-2,-1) 裁剪窗口为wxl=0,wxr=2,wyb=0,wyt=2。

武汉理工大学《计算机图形学》大作业

《计算机图形学基础》大作业 课程名称计算机图形学基础开课学院计算机科学与技术学院指导教师姓名佘名高 学生姓名杨峻 学生专业班级软件工程1102 2013-2014 学年第一学期

一、命题计划 题目:C语言图形编程 (以下题目文档要求:①基本论述②算法③程序源代码④界面图) 二、内容与要求 (1)撰写内容 1.根据Bresenham直线绘制算法,实现直线的绘制。 2.用C语言编写:画y=sin(x)的图形(要求画出[-2π,2π]的图形及笛卡尔坐标)3.用C语言编写一个小圆沿着大圆运动的程序。 4.对图1中的零件图形,如何根据它所标注的尺 寸,按照适当的顺序有步聚地画出该图形。 提示:首先要分析此零件图形的几何关系,了解 构成这个图形各线段的性质,才能顺利地绘出此图形。 线段(直线或圆弧)在零件图形中分为三类,即已知线 段、中间线段和连接线段。以圆弧为例,按几何原理, 已知圆心的两个位置尺寸与半径尺寸便可画出圆。因 此图形中,已知这三个尺寸的圆弧称为已知圆弧,画 图时应该最先画出。凡已知其中二个尺寸的圆弧称为 中间圆弧。凡只已知一个尺寸(一般是圆弧半径)的圆 弧称为连接圆弧。中间圆弧和连接圆弧都缺省圆心的位置尺寸,它的几何位置是根据相切的条件来确定的。因此画圆弧的顺序为:先画已知圆弧,再画中间圆弧,最后画连接圆弧。 本零件图形是对称图形,三个小圆均匀分布在圆周中心线上,φ10,φ25,φ50和R10都是已知圆弧,R8为连接圆弧,φ50是已知圆弧的端点和R10已知圆弧的端点与连接圆弧的端点相切,从而构成整个图形。 (2)撰写要求 1.基本论述 2.算法 3.程序源代码 4.程序运行截图 5.小结

计算机图形学课程设计

《计算机图形学》课程设计报告题目名称:球体背面剔除消隐算法 专业计算机科学与技术 班级计科15升-1班 学号 1516353004 姓名 指导教师王玉琨 2016 年 06 月 07 日

目录 设计内容与要求 (03) 总体目标和要求 (03) 内容与要求 (03) 总体设计 (03) 2.1 球的消隐处理基本原理 (03) 2.2 具体设计实现 (04) 详细设计 (04) 3.1调试后正确的程序清单 (04) 功能实现 (08) 4.1程序运行结果 (09) 4.2 功能实现及分析 (09) 总结 (09) 参考文献 (10)

球体背面剔除消隐算法 第 1章设计内容与要求 1.1 总体目标和要求 课程设计的目的:以图形学算法为目标,深入研究。继而策划、设计并实现一个能够表现计算机图形学算法原理的或完整过程的演示系统, 并能从某些方面作出评价和改进意见。 通过完成一个完整程序,经历策划、设计、开发、测试、总结和验收各阶段,达到: 1) 巩固和实践计算机图形学课程中的理论和算法; 2) 学习表现计算机图形学算法的技巧; 3) 培养认真学习、积极探索的精神; 4) 具备通过具体的平台实现图形算法的设计、编程与调试的能力; 5) 完成对实验结果分析、总结及撰写技术报告的能力。 总体要求:策划、设计并实现一个能够充分表现图形学算法的演示系统,界面要求美观大方,能清楚地演示算法执行的每一个步骤。 开发环境:Viusal C++ 6.0 1.2 内容与要求 球体背面剔除消隐算法 内容:(1)掌握背面剔除消隐算法原理; (2)实现矢量点积与叉积运算; (3)透视投影变换 (4)曲面体经纬线划分方法 功能要求: (1)绘制球体线框模型的透视投影图,使用背面剔除算法实现动态消隐; (2)通过右键菜单显示消隐效果,右键菜单有两个选项:未消隐与消隐; (3)使用键盘的上下左右控制键旋转消隐前后的球体; (4)单击左键增加视距,右击缩短视距; 第2章总体设计 2.1 球的消隐处理基本原理 球体的曲面通常采用一组网格多边形来表示,即把曲面离散成许多小平面片,用平面逼近曲面,一般使用许多四边形来逼近曲面。 网格四边形愈多,逼近曲面的精度就愈高,逼近效果就愈好,曲面看起来就越光滑。一般根据实际需要来确定合适的逼近精度即网格多边形数目。 当曲面表示为一组网格多边形时,消隐处理的主要工作是确定各网格多边形的可见性,由此可用平面立体的算法对曲面进行消隐处理。 球面的参数方程为:

16秋西交《计算机图形学》在线作业

奥鹏17春16秋西交《计算机图形学》在线作业 一、单选(共30 道,共60 分。) 1. 在三维造型中,不可以使用垂直扫掠造型方法构造的有( )。 A. 园柱 B. 长方体 C. 三棱锥 D. 正十二面体 标准解: 2. 在直线段的参数方程表示方法中,参数t的取值范围为( )。 A. 【0,1】 B. 【0,∞】 C. 【-1,1】 D. 【-1,0】 标准解: 3. 如果希望在CorelDRAW中创建的多个页面具有相同的图形元素,可以执行下面的哪一项操作( ) A. 先创建多个页面,然后分别在各个页面中绘制相同的图形元素 B. 创建一个页面并在此页面绘制需要的图形元素,然后再将此页面复制多个 C. 选择“Layout-Page Setup”命令,在弹出的对话框中进行设置 D. 在Master Page中创建一个图层,在此图层中绘制希望出现在各个页面中的图形元素,则此各个页面将具有相同的图形元素 标准解: 4. 下列有关平面几何投影的叙述,错误的是( )。 A. 透视投影又可分为一点透视、二点透视、三点透视 B. 斜投影又可分为等轴测、斜二测 C. 正轴测又可分为等轴测、正二测、正三测 D. 正视图又可分为主视图、侧视图、俯视图 标准解: 5. 要快速以递增的方式增大字体大小,可以利用“文本”工具选择特定的字符后,执行以下哪步操作( ) A. 按CTRL + "+"键 B. 双击“缩放”工具 C. 按CTRL + 数字小键盘上的"8" D. 按CTRL + 数字小键盘上的"2" 标准解: 6. 有M个控制顶点Pi(i=1,…k)所决定的n次B样曲线,由()段n次B样曲线段光滑连接而成。

计算机图形学实验报告

《计算机图形学》实验报告姓名:郭子玉 学号: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; }

相关文档
最新文档