实验三 二维图元的填充

实验三  二维图元的填充
实验三  二维图元的填充

实验三二维图元的填充

实验目的:

通过实验掌握下列知识:

1.熟悉OpenGL中对颜色的设置

2.边界填充算法的理解与实现;

3.泛滥填充算法的理解与实现;

4.扫描线填充算法的理解与实现;

内容及步骤:

一、OpenGL中颜色的设置

OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式。无论哪种颜色模式,计算机都必须为每一个像素保存一些数据。不同的是,RGBA模式中,数据直接就代表了颜色值;而颜色索引模式中,数据代表的是一个颜色表的索引,要得到真正的颜色,还必须到颜色表去查找。颜色索引模式主要用于早期性能差,只能显示有限颜色的显示设备上,现在由于显示设备的发展,普遍都采用RGBA模式,所以,我们只介绍RGBA模式。

RGBA模式中,每一个像素会保存以下数据:R值(红色分量)、G值(绿色分量)、B值(蓝色分量)和A值(alpha分量,就是透明度分量)。其中红、绿、蓝三种颜色相组合,就可以得到我们所需要的各种颜色,而alpha不直接影响颜色,它将留待以后介绍。

在RGBA模式下选择颜色是十分简单的事情,只需要一个函数。glColor*系列函数可以用于设置当前绘制颜色(前景色),其中三个参数的版本可以指定R、G、B的值,而A值采用默认;四个参数的版本可以分别指定R、G、B、A的值。例如:

void glColor3(type r, type g, type b)

void glColor3v(type * color)

void glColor4(type r, type g, type b, type a)

void glColor4v(type * color)

用标准类型来指定RGB或RGBA颜色值。如果函数名的末尾出现v,则颜色值由color所指向的数组指定,该数组中每个元素的类型均为type。

将浮点数作为参数,其中0.0表示不使用该种颜色,而1.0表示将该种颜色用到最多。例如:

glColor3f(1.0f, 0.0f, 0.0f); 表示不使用绿、蓝色,而将红色使用最多,于是得到最纯净的红色。

glColor3f(0.0f, 1.0f, 1.0f); 表示使用绿、蓝色到最多,而不使用红色,混合的效果就是浅蓝色。

glColor3f(0.5f, 0.5f, 0.5f); 表示各种颜色使用一半,效果为灰色。

glColor3f(0.0f, 0.0f, .0.0f); 表示纯黑。

glColor3f(1.0f, 1.0f, .1.0f); 表示纯白。

用数组时,例如:

float c[3]={ 1.0f, 0.0f, 0.0f }; glColor3fv(c);

与glColor3f(1.0f, 0.0f, 0.0f);等价,都是指定当前绘制颜色是红色。

注意:浮点数可以精确到小数点后若干位,这并不表示计算机就可以显示如此多种颜色。实际上,计算机可以显示的颜色种数将由硬件决定。如果OpenGL 找不到精确的颜色,会进行类似“四舍五入”的处理。

注意:glColor系列函数,在参数类型不同时,表示“最大”颜色的值也不同。

采用f和d做后缀的函数,以1.0表示最大的使用。

采用ub或i做后缀的函数,以255表示最大的使用。

以下两种颜色相同,都表示纯蓝:

glColor3f(0.0f,0.0f,1.0f);

glColor3i(0,0,255) ;

另外,我们可以用如下函数设定清除颜色,也就是背景颜色:glClearColor(float , float, float, float);

四个参数分别就是RGBA四个通道的值,表示方法和glColor4f相同,例如:glClearColor(1.0f, 1.0f, 1.0f, 1.0f); 把背景设为白色;

glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 把背景设为黑色;

glClearColor(1.0f, 0.0f, 0.0f, 1.0f); 把背景设为纯红;

在OpenGL程序初始化的时候,会用到一个函数:

glClear(GL_COLOR_BUFFER_BIT);

这个函数是把屏幕上的颜色全部清空,变为glClearColor指定的背景颜色。GL_COLOR_BUFFER_BIT是头文件里定义的一个系统常量。

在OpenGL中,颜色是OpenGL状态的一部分。我们可以认为在OpenGL的状态变量中存在一种当前绘制颜色(current drawing color)和当前清除颜色(current clear color),其中前者由函数glColor*()来指定,后者由glClearColor()来指定。用于绘制对象的颜色即为当前绘制颜色。

当要绘制图形时,所用颜色从当前绘制颜色(current drawing color)中读取;当要清空屏幕时,所用颜色从当前清除颜色(current clear color)中读取。所以,颜色与对象并不存在依附关系,而是作为OpenGL的内部状态。虽然在程序中看起来好像颜色与对象和顶点结合在一起,但实际上在程序定义顶点时,OpenGL是依据当前状态来查找当前颜色的。也就是说,不存在红色的点,蓝色的线,只是说,在绘制该点时,当前绘制颜色是红色,在绘制该条线时,当前颜色是蓝色。程序中哪些地方修改了当前颜色,我们必须特别留意。

二、实现边界填充算法

读懂课本第165页所给的如下代码,理解执行的原理:

void boundaryFill4 (int x, int y, int fillColor, int borderColor)

{

int interiorColor;

/* Set current color to fillColor, then perform following oprations. */

getPixel (x, y, interiorColor);

if ((interiorColor != borderColor) && (interiorColor != fillColor)) {

setPixel (x, y); // Set color of pixel to fillColor.

boundaryFill4 (x + 1, y , fillColor, borderColor);

boundaryFill4 (x - 1, y , fillColor, borderColor);

boundaryFill4 (x , y + 1, fillColor, borderColor);

boundaryFill4 (x , y - 1, fillColor, borderColor)

}

}

该函数中,实际上就是用某种颜色fillColor把一副图像中的另外一种颜色borderColor作为边界的图像部分进行填充。getPixel (x, y, interiorColor)是取当前像素(x,y)的颜色,颜色值保存到interiorColor变量里面,然后判断当前像素颜色interiorColor是否与边界颜色borderColor相等,如果相等,表明已经到达边界,不进行填充;再判断当前像素颜色interiorColor是否与填充颜色fillColor 相等,如果相等,表明已经进行了填充,不需要再次填充;如果当前像素颜色interiorColor与边界颜色borderColor和填充颜色fillColor都不相等,表明当前像素是边界内部的未填充像素,就用setPixel (x, y)对该像素进行填充颜色fillColor,并继续递归填充当前像素的的上下左右四个像素。

注意:

(1)代码没有主函数及其它OpenGL的初始化函数,请用前面实验1中的代码进行添加,该填充函数boundaryFill4 (int x, int y, int fillColor, int borderColor)在回调函数myDraw()中调用执行;

(2)在myDraw()中调用执行填充函数boundaryFill4 (int x, int y, int fillColor, int borderColor)之前,需要我们用边界颜色borderColor指定一个边界,并且指定填充的第一点,该点的坐标即为myDraw()中调用的填充函数boundaryFill4 (int x, int y, int fillColor, int borderColor)的x和y的值,该点必须在指定边界的内部,填充颜色fillColor也需要我们指定。指定边界可用

glBegin(GL_LINE_LOOP);

……

glEnd();

指定一个闭合区域。

注意该区域不要太大,否则递归执行boundaryFill4时,要用到的堆栈数量非常巨大,系统可能发生堆栈溢出的错误。解决的方法就是把递归程序改写为非递归程序。

(3)函数中的颜色fillColor和borderColor的类型为int,但OpenGL中的RGB 颜色需要3个0.1~1.0的浮点数指定或3个0~255的整数指定,所以我们需要重

新定义颜色类型,例如,定义颜色类型Color为一个浮点数组或一个结构体:例如:

typedef float Color[3];

这时,Color类型为长度是3的浮点数组,如果定义Color的变量

Color fillColor;

那么,fillColor[0], fillColor[10], fillColor[2]就可以分别表示RGB三个通道的值。(4)getPixel (x, y, interiorColor)是取当前像素(x,y)的颜色,颜色值保存到interiorColor变量里面,由于getPixel不是一个系统函数,所以需要我们自己定义,借助OpenGL函数glReadPixels完成,该函数语法见课本第120页,即:glReadPixels(xmin, ymin, width, height, dataFormat, dataType, array)

作用是把从(xmin, ymin)位置开始,大小为宽width, 高height的一块的像素值读入,依次保存到数组array中。像素值类型由dataFormat,和dataType指定。dataFormat的可用类型有GL_COLOR_INDEX, GL_STENCIL_INDEX, GL_DEPTH_COMPONENT, GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA, GL_RGB, GL_RGBA, GL_LUMINANCE和GL_LUMINANCE_ALPHA。dataType的可用类型有GL_UNSIGNED_BYTE, GL_BYTE, GL_BITMAP, GL_UNSIGNED_SHORT, GL_SHORT, GL_UNSIGNED_INT, GL_INT和GL_FLOAT。

getPixel()可定义为

void getPixel(GLint x, GLint y, Color c)

{

glReadPixels(x,y,1,1,GL_RGB,GL_FLOAT,c);

}

表示取从(x,y)开始的一个像素的值,值的类型为用FLOAT 表示的RGB颜色。c为数组名,相当于一个指针,可双向传递。

(5)函数中的颜色值比较(interiorColor != borderColor) && (interiorColor != fillColor),由于颜色类型改为Color,故颜色比较的函数需要重写,例如:

bool rgbColorEqual(Color c1,Color c2)

{

//补充代码,当三个通道都相等时,返回真,否则返回假;

}

但是浮点数的比较不能直接用“= =”,因为浮点数在内存中存储时会有误差,如3.14可能存为3.1399999999,也可能存为3.140000001,用“= =”比较时,3.1399999999 !=3.140000001。方法是比较的两个数想减,绝对值小于一个很小的正整数时,就判定两个数相等。如a和b是两个浮点数,那么当abs (a – b ) < 0.001,就判定a等于b。这一点,在所有的程序设计里面都是要遵循的规则。

这时,两个比较可以改为

!(rgbColorEqual(interiorColor,borderColor)) && !(rgbColorEqual(interiorColor,fillColor)) (6)代码中调用setPixel(int , int)函数,该函数不是C或C++的系统函数,需要我们自己去定义,定义方法同实验二。

(7)由于填充速度很快,如果直接运行,我们看不到填充的过程,所以我们需要放慢填充速度,可以每填充一个像素休息一段时间,调用Sleep(5); ,该函数参数是休息的毫秒数。Sleep()函数在头文件windows.h中定义,所以需要在源代码开头加上#include

三、实现泛滥填充算法

读懂课本第167页所给的如下代码,理解执行的原理:

void floodFill4 (int x, int y, int fillColor, int interiorColor)

{

int color;

/* Set current color to fillColor, then perform following operations. */

getPixel (x, y, color);

if (color = = interiorColor) {

setPixel (x, y); // Set color of pixel to fillColor.

floodFill4 (x + 1, y, fillColor, interiorColor);

floodFill4 (x - 1, y, fillColor, interiorColor);

floodFill4 (x, y + 1, fillColor, interiorColor);

floodFill4 (x, y - 1, fillColor, interiorColor)

}

}

该函数中,实际上就是用某种颜色fillColor把一副图像中的另外一种颜色interiorColor进行替换。getPixel (x, y, color)是取当前像素(x,y)的颜色,颜色值保存到color变量里面,然后判断当前像素颜色color是否与要替换的颜色interiorColor相等:如果相等,表明该像素需要进行替换,所以就setPixel (x, y),把当前像素(x,y)的颜色设置为颜色fillColor,并且再对当前像素的上下左右四个像素进行替换,递归执行该程序;如果不相等,就不需要进行替换。

除了注意上述边界填充算法中的一些改动外,还需注意:该函数是用某种颜色fillColor把一副图像中的另外一种颜色interiorColor进行替换,所以在myDraw()中调用执行填充函数floodFill4 (int x, int y, int fillColor, int interiorColor)之前,需要我们用颜色interiorColor指定一块替换的区域,并且指定填充的第一点,该点的坐标即为myDraw()中调用的填充函数floodFill4 (int x, int y, int fillColor, int interiorColor)的x和y的值,该点必须在这个替换的区域内部,填充颜色fillColor也需要我们指定。替换的区域可用

glBegin(GL_POLYGON);

……

glEnd();

指定一个多边形填充区域。

计算机图形学实验报告

计算机图形学 实验报告 姓名:谢云飞 学号:20112497 班级:计算机科学与技术11-2班实验地点:逸夫楼507 实验时间:2014.03

实验1直线的生成 1实验目的和要求 理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析 实验数据的能力; 编程实现DDA算法、Bresenham中点算法;对于给定起点和终点的 直线,分别调用DDA算法和Bresenham中点算法进行批量绘制,并记 录两种算法的绘制时间;利用excel等数据分析软件,将试验结果编 制成表格,并绘制折线图比较两种算法的性能。 2实验环境和工具 开发环境:Visual C++ 6.0 实验平台:Experiment_Frame_One(自制平台)。 本实验提供名为 Experiment_Frame_One的平台,该平台提供基本 绘制、设置、输入功能,学生在此基础上实现DDA算法和Mid_Bresenham 算法,并进行分析。 ?平台界面:如错误!未找到引用源。所示 ?设置:通过view->setting菜单进入,如错误!未找到引 用源。所示 ?输入:通过view->input…菜单进入.如错误!未找到引用 源。所示 ?实现算法: ◆DDA算法:void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1) Mid_Bresenham法:void CExperiment_Frame_OneView::Mid_Bresenham(int X0, int Y0, int X1, int Y1)

3实验结果 3.1程序流程图 1)DDA算法流程图:开始 定义两点坐标差dx,dy,以及epsl,计数k=0,描绘点坐标x,y,x增 量xIncre,y增量yIncre ↓ 输入两点坐标x1,y1,x0,y0 ↓ dx=x1-x0,dy=y1-y0; _________↓_________ ↓↓ 若|dx|>|dy| 反之 epsl=|dx| epsl=|dy| ↓________...________↓ ↓ xIncre=dx/epsl; yIncre=dy/epsl ↓ 填充(强制整形)(x+0.5,y+0.5); ↓←←←← 横坐标x+xIncre; 纵坐标y+yIncre; ↓↑ 若k<=epsl →→→k++ ↓ 结束 2)Mid_Bresenham算法流程图开始 ↓ 定义整形dx,dy,判断值d,以及UpIncre,DownIncre,填充点x,y ↓ 输入x0,y0,x1,y1 ______↓______ ↓↓ 若x0>x1 反之 x=x1;x1=x0;x0=x; x=x0;

图形学实验报告

计 算 机 图 形 学 实验指导书 学号:1441901105 姓名:谢卉

实验一:图形的几何变换 实验学时:4学时 实验类型:验证 实验要求:必修 一、实验目的 二维图形的平移、缩放、旋转和投影变换(投影变换可在实验三中实现)等是最基本的图形变换,被广泛用于计算机图形学的各种应用程序中,本实验通过算法分析以及程序设计实验二维的图形变换,以了解变换实现的方法。如可能也可进行裁剪设计。 二、实验内容 掌握平移、缩放、旋转变换的基本原理,理解线段裁剪的算法原理,并通过程序设计实现上述变换。建议采用VC++实现OpenGL程序设计。 三、实验原理、方法和手段 1.图形的平移 在屏幕上显示一个人或其它物体(如图1所示),用交互操作方式使其在屏幕上沿水平和垂直方向移动Tx和Ty,则有 x’=x+Tx y’=y+Ty 其中:x与y为变换前图形中某一点的坐标,x’和y’为变换后图形中该点的坐标。其交互方式可先定义键值,然后操作功能键使其移动。 2.图形的缩放 在屏幕上显示一个帆船(使它生成在右下方),使其相对于屏幕坐标原点缩小s倍(即x方向和y方向均缩小s倍)。则有: x’=x*s y’=y*s 注意:有时图形缩放并不一定相对于原点,而是事先确定一个参考位置。一般情况下,参考点在图形的左下角或中心。设参考点坐标为xf、yf则有变换公式x’=x*Sx+xf*(1-Sx)=xf+(x-xf)*Sx y’=y*Sy+yf*(1-Sy)=yf+(y-yf)*Sy 式中的x与y为变换前图形中某一点的坐标,x’和y’为变换后图形中该点的坐标。当Sx>1和Sy>1时为放大倍数,Sx<1和Sy<1时为缩小倍数(但Sx和Sy

图形学实验三-画圆

实验三圆的生成算法 一、实验目的 编写圆的扫描转换算法程序,验证算法的正确性。 二、实验任务(2学时) 编写中点画圆法的扫描转换程序,考虑原点在(x0,y0)处程序的改动;编写Bresenham 画圆法的扫描转换程序,思考其与中点画圆算法的区别于联系。 三、实验内容 1、圆的Bresenham算法 (1)算法 设圆的半径为r。先考虑圆心在(0, 0),并从x=0、y=r,开始的顺时针方向的1/8圆周的生成过程。在这种情况下,x每步增加1,从x=0开始,到x=y结束。即有 x i+1 = x i + 1 相应的y i+1则在两种可能中选择: y i+1 = y i或者y i+1 = y i-1 选择的原则是考察精确值y是靠近y i还是 靠近y i-1(如右图), 计算式为: y2 = r2-(x i+1)2 d1 = y i2-y2 = yi2-r2+(x i+1)2 d2 = y2-(y i-1)2 = r2-(x i+1)2-(y i-1)2 令p i=d1-d2,并代入d1、d2,则有 p i = 2(x i+1)2 + y i2 + (y i-1)2-2r2 p i称为误差。如果p i<0则y i+1=y i,否则y i+1=y i-1。 p i的递归式为 p i+1 = p i + 4x i +6+2(y i+12- y i2) -2(y i+1-y i) p i的初值由上式代入x i=0,y i=r而得 p1 = 3-2r 根据上面的推导,圆周生成算法思想如下: 1) 求误差初值,p1=3-2r,i=1,画点(0, r); 2)求下一个光栅位置,其中x i+1=x i+1,如果p i<0则y i+1=y i,否则y i+1=y i-1; 3) 画点(x i+1, y i+1); 4)计算下一个误差,如果p i<0则p i+1=p i+4x i+6,否则p i+1=p i+4(x i-y i)+10;

实验8MATLAB图形用户界面设计实验报告

实验8 MATLAB图形用户界面设计实验报告实验报告 课程名称:MATLAB应用成绩: 实验项目名称:MATLAB图形用户界面设计实验时间:11.6 指导教师(签名): 班级:XXXXX 姓名:XXXXX 学号:XXX 实验目的: 1. 熟悉MATLAB的菜单设计方法 2. 熟悉MATLAB的主要控件使用方法 3. 熟悉MATLAB的GUI设计流程 实验环境: MATLAB 7.1 实验内容及过程: 简单计算器的设计:在MATLAB GUI的实验环境中,通过MATLAB图形用户界面设计的方法,设计一个 简单的计算器,以实现简单数据的退出、清屏、删除、四则运算等基本功能。 实验过程、结果及分析:

计算器代码: function varargout = jsq(varargin) gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 第 1 页共 6 页 'gui_OpeningFcn', @jsq_OpeningFcn, ... 'gui_OutputFcn', @jsq_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else

计算机图形学实验报告

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

图形学画圆实验报告

图形学画圆实验报告

4.2.3程序实现与上机实习(二) 一、实验目的 编写圆和椭圆的扫描转换算法程序,验证算法的正确性。 二、实验任务 1.编写中点画圆法的扫描转换程序,考虑原点在(x0,y0)处程序的改动; 2.添加鼠标程序,实现交互式画圆;3.编写中点画椭圆法的扫描转换程序;4.添加鼠标程序,实现交互式画椭圆;三、实验内容 1.编写中点画圆法的扫描转换程序,考虑原点在(x0,y0)处程序的改动; 分析:考虑圆心不再原点,设圆心坐标为(x0,y0)。通过平移坐标原点到圆心,则第二个8分圆上一点p(x,y),其原始坐标为 x’=x+x0 y’=y+y0 即p’1(x0 +x, y+y0) 其它7个对称点分别是:p’2(x0+y,y+x0), p’3

(x0+y,y0-x),p ’4 (x0+x,y0-y),p ’5 (x0-x,y0-y),p ’6 (x0-y,y0-x),p ’7 (x0-y,y0+x),p ’8 (x0-x,y0+y) 算法程序如下: MidpointCircle(int x0,int y0,int r, int color) { int x,y; float d; x=0;y=r;d=1.25-r; CirPot(x0,y0,x,y,color); while (x<=y) { if(d<0) { d+=2*x+3; x++; } else { d+=2*(x-y)+5; x++; y--; } O(0Y X R X Y p ’1(x0 p ’2 p ’3 p ’4 p ’5 p ’6 p ’7 p ’8

CirPot(x0,y0,x,y,color); } /* while*/ } /* MidpointCiecle */ int CirPot(int x0,int y0,int x,int y,int color) { Setpixel((x0+x),(y0+y)); Setpixel((x0+y),(y0+x)); Setpixel((x0+y),(y0-x)); Setpixel((x0+x),(y0-y)); Setpixel((x0-x),(y0-y)); Setpixel((x0-y),(y0-x)); Setpixel((x0-y),(y0+x)); Setpixel((x0-x),(y0+y)); } 程序实现步骤: (1)建立MidPointCircle工程文件; (2)右击CMidPointCircleView类,建立成员函数 void MidpointCircle(CDC *pDC,int x0, int y0, int r, COLORREF color) int CirPot(CDC *pDC,int x0, int y0, int x,

Java基础实验报告-图形用户界面设计

南京工程学院 实验报告 课程名称 JAVA基础 实验项目名称图形用户界面设计 实验学生班级 实验学生姓名 学号 同组学生姓名 实验时间 实验地点 实验成绩评定 指导教师签字年月日

一、实验目的和要求 1.掌握Java Swing组建的使用方法,包括窗口、框架、对话框、面板、文本编辑框、按钮、组合框等多种布局方式,掌握窗口菜单和快捷菜单设计方式。 2.理解委托时间处理模型,掌握不同组件、不同事件的事件处理方法,设计出能够响应事件的Java图形用户界面。 3.熟悉在组件上绘图的方法。 二、实验题目 用表格存储并显示个人所得税税率表,给定一个月收入值,计算应缴的个人所得税。 三、实验方法与步骤(需求分析、算法设计思路、流程图等) 算法设计思路:本次实验题目为计算个人所得税,所以本人从网上找到了国家最新的税收政策,以下为截图:

因此,我设计了以下核心算法 public void actionPerformed(ActionEvent e) { if(e.getSource()==button_b) { double wage=Double.parseDouble((String)text_wage.getText()); double tax = 0; if(wage<=3500) tax=0; if(wage>3500&&wage<=5000) tax=(wage-3500)*0.03; if(wage>5000&&wage<=8000) tax=(wage-3500)*0.1-105; if(wage>8000&&wage<=12500) tax=(wage-3500)*0.2-555; if(wage>12500&&wage<=38500)

图形学实验报告

山东建筑大学测绘地理信息学院 实验报告 (2016—2017学年第一学期) 课程:计算机图形学 专业:地理信息科学 班级:地信141 学生姓名:王俊凝 学号:20140113010 指

实验一直线生成算法设计 一、实验目的 掌握基本图形元素直线的生成算法,利用编程语言C分别实现直线和圆的绘制算法。 二、实验任务 在TurboC环境下开发出绘制直线和圆的程序。 三、实验仪器设备 计算机。 四、实验方法与步骤 1 运行TurboC编程环境。 2 编写Bresenham直线绘制算法的函数并进行测试。 3 编写中点圆绘制算法的函数并进行测试。 4 增加函数参数,实现直线颜色的设置。 提示: 1. 编程时可分别针对直线和圆的绘制算法,设计相应的函数,例如void drawline(…)和void drawcircle(…),直线的两个端点可作为drawline的参数,圆的圆心和半径可作为drawcircle的参数。 2. 使用C语言编写一个结构体类型用来表示一个点,结构体由两个成员构成,x和y。这样,在向函数传入参数时,可使用两个点类型来传参。定义方法为:

typedef struct{ int x; int y; }pt2; 此处,pt2就是定义的一个新的结构体数据类型,之后就可用pt2来定义其他变量,具体用法见程序模板。 3. 在main函数中,分别调用以上函数,并传入不同的参数,实现对直线的绘制。 4. 线的颜色也可作为参数传入,参数可采用TurboC语言中的预设颜色值,具体参见TurboC图形函数。 五、注意事项 1 代码要求正确运行,直线和圆的位置应当为参数,实现可配置。 2 程序提交.c源文件,函数前和关键代码中增加注释。 程序模板 #include #include typedef struct{ int x; int y; }pt2; /*declare your drawing functions.*/ void drawline(pt2 startpt,pt2 endpt,int color); void drawcircle(pt2 centerpt,int radius,int color); void circlePlotPoints(pt2 centerpt,int x,int y,int color); int main() { int color,radius;

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

洛阳理工学院实验报告用纸

(2)画理想圆流程图如图-1: 图-1:画理想圆流程图 (3)中点画圆法 图-2 中点画圆法当前象素与下一象素的候选者

数,将乘法运算改成加法运算,即仅用整数实现中点画圆法。 (4)Bresenham画圆法 Bresenham画线法与中点画线法相似,,它通过每列象素中确定与理想直线最近的象素来进行直线的扫描的转换的。通过各行,各列的象素中心构造一组虚拟网格线的交点,然后确定该列象素中与此交点最近的的象素。该算法的巧妙之处在于可以采用增量计算,使得对于每一列,只要检查一个误差项的符号,就可以确定该列的所求对象。 假设x列的象素已确定,其行下标为y。那么下一个象素的列坐标必为x+1。而行坐标要么不变,要么递增1。是否递增1取决于如图所示的误差项d的值。因为直线的起始点在象素中心,所以误差项d的初始值为0。X下标每增加1,d的值相应递增直线的斜率值,即d=d+k(k=y/x为直线斜率)。一旦d>=1时,就把它减去,这样保证d始终在0、1之间。当d>0.5时,直线与x+1垂直网络线交点最接近于当前象素(x,y)的右上方象素(x+1,y+1);而当d<0.5时,更接近于象素(x+1,y),当d=0。5时,与上述二象素一样接近,约定取(x+1,y+1)。令e=d-0。5。则当e>=0时,下一象素的y下标增加1,而当e〈0时,下一象素的y下标不增。E的初始值为-0.5. (二)实验设计 画填充点流程图,如图-3: 图-3:圆的像素填充过程NS图 画理想圆,记录圆心坐标,计算半径大小,并记录 是否开始填充 否 是 初始化计数器、标志变量,设置最大计数值 调用Bresenha m画圆算法 否 是 填充标记是否为真 (While)计数变量小于最大计数值 循环变量temp + 1 填充计算出来的temp个坐 标点 计算需要填充坐标数组的 前temp个坐标

Java图形用户界面实验报告

西安邮电大学 (计算机学院) 课内实验报告 实验名称:图形用户界面 专业名称:计算机科学与技术 班级:计科1405班 学生姓名:高宏伟 学号:04141152 指导教师:刘霞林 实验日期:一、实验目的 了解图形用户界面基本组件窗口、按钮、文本框、选择框、滚动条等的使用方法,了解如何使用布局管理器对组件进行管理,以及如何使用Java 的事件处理机制。 二、实验要求 1. 掌握使用布局管理器对组件进行管理的方法。

2. 理解Java 的事件处理机制,掌握为不同组件编写事件处理程序的方法。 3. 掌握编写独立运行的窗口界面的方法。 4. 掌握组件的使用方法。 5. 了解对话框的使用方法。 三、实验内容 (一)算术测试。 实验要求: 编写一个算术测试小软件,用来训练小学生的算术能力。程序由3个类组成,其中Teacher类对象负责给出算术题目,并判断回答者的答案是否正确; ComputerFrame类对象负责为算术题目提供视图,比如用户可以通过 ComputerFrame类对象提供的GUI界面看到题目,并通过该GUI界面给出题目的答 案;MainClass是软件的主类。 程序模板: public class Teacher { int numberOne,numberTwo; String operator=""; boolean right; public int giveNumberOne(int n) { numberOne=(int)()*n)+1; return numberOne; } public int giveNumberT wo(int n) { numberTwo=(int)()*n)+1; return numberTwo; } public String giveOperator() { double d=(); if(d>= operator="+"; else operator="-"; return operator; } public boolean getRight(int answer) { if("+")) { if(answer==numberOne+numberTwo) right=true; else right=false; }

计算机图形学 有效边表填充算法实验报告

实验题目:实验二有效边表填充算法 1.实验目的: 设计有效边表结点和边表结点数据结构 设计有效边表填充算法 编程实现有效边表填充算法 2.实验描述: 下图1 所示多边形覆盖了12 条扫描线,共有7 个顶点和7 条边。7 个顶点分别为:P0(7,8),P1(3,12),P2(1,7),P3(3,1), P4(6,5), P5(8,1), P6(12,9)。在1024×768 的显示分辩率下,将多边形顶点放大为P0(500,400),P1(350,600),P2(250,350),P3(350,50), P4(500,250), P5(600,50), P6(800,450)。请使用有效边表算法填充该多边形。 图1示例多边形

图2 屏幕显示多边形 3.算法设计: (1)建立AET和BUCKET类; (2)初始化桶,并在建立桶结点时为其表示的扫描线初始化为带头结点的链表; (3)对每个桶结点进行循环,将桶内每个结点的边表合并为有效边表,并进行有效边表循环; (4)按照扫描线从小到大的移动顺序,计算当前扫描线与多边形各边的交点,然后把这些交点按X值递增的顺序进行排序,配对,以确定填充区间; (5)用指定颜色点亮填充区间内的所有像素,即完成填充工作。 4.源程序: 1)//AET.h class AET { public: AET(); virtual ~AET(); double x; int yMax; double k;//代替1/k AET *next; }; //AET..cpp AET::AET() {

} AET::~AET() { } 2) //Bucket.h #include "AET.h" class Bucket { public: Bucket(); virtual ~Bucket(); int ScanLine; AET *p;//桶上的边表指针 Bucket *next; }; // Bucket.cpp Bucket::Bucket() { } Bucket::~Bucket() { } 3)//TestView.h #include "AET.h"//包含有效边表类 #include "Bucket.h"//包含桶类 #define Number 7//N为闭合多边形顶点数,顶点存放在整型二维数组Point[N]中class CTestView : public CView { 。。。。。。。。。 public: void PolygonFill();//上闭下开填充多边形 void CreatBucket();//建立桶结点桶 void Et();//构造边表 void AddEdge(AET *);//将边插入AET表 void EdgeOrder();//对AET表进行排序

计算机图形学实验报告 (2)

中南大学信息科学与工程学院 实验报告实验名称 实验地点科技楼四楼 实验日期2014年6月 指导教师 学生班级 学生姓名 学生学号 提交日期2014年6月

实验一Window图形编程基础 一、实验类型:验证型实验 二、实验目的 1、熟练使用实验主要开发平台VC6.0; 2、掌握如何在编译平台下编辑、编译、连接和运行一个简单的Windows图形应用程序; 3、掌握Window图形编程的基本方法; 4、学会使用基本绘图函数和Window GDI对象; 三、实验内容 创建基于MFC的Single Document应用程序(Win32应用程序也可,同学们可根据自己的喜好决定),程序可以实现以下要求: 1、用户可以通过菜单选择绘图颜色; 2、用户点击菜单选择绘图形状时,能在视图中绘制指定形状的图形; 四、实验要求与指导 1、建立名为“颜色”的菜单,该菜单下有四个菜单项:红、绿、蓝、黄。用户通过点击不同的菜单项,可以选择不同的颜色进行绘图。 2、建立名为“绘图”的菜单,该菜单下有三个菜单项:直线、曲线、矩形 其中“曲线”项有级联菜单,包括:圆、椭圆。 3、用户通过点击“绘图”中不同的菜单项,弹出对话框,让用户输入绘图位置,在指定位置进行绘图。

五、实验结果: 六、实验主要代码 1、画直线:CClientDC *m_pDC;再在OnDraw函数里给变量初始化m_pDC=new CClientDC(this); 在OnDraw函数中添加: m_pDC=new CClientDC(this); m_pDC->MoveTo(10,10); m_pDC->LineTo(100,100); m_pDC->SetPixel(100,200,RGB(0,0,0)); m_pDC->TextOut(100,100); 2、画圆: void CMyCG::LineDDA2(int xa, int ya, int xb, int yb, CDC *pDC) { int dx = xb - xa; int dy = yb - ya; int Steps, k; float xIncrement,yIncrement; float x = xa,y= ya; if(abs(dx)>abs(dy))

java实验报告实验六Java图形用户界面

信息工程学院 Java程序设计实习报告 JAVA图形用户界面 实验六Java图形用户界面 1.实验目的 (1)掌握图形用户界面基本组件。 (2)了解如何使用布局管理器对组件进行管理。 (3)掌握Java事件处理机制。 2.实验内容 实验题1 编写一个模拟计算器的程序,使用面板和网格布局,添加一个文本框,10个数字按钮(0-9),4个加减乘除按钮,一个等号按钮,一个清除按钮,要求将计算公式和结果显示在文本框中。 运行结果: 实验报告的内容与格式按任课教师的要求书写。

加法: 主要代码: private void initComponents() { jButton1 = new javax.swing.JButton(); jButton2 = new javax.swing.JButton(); jButton3 = new javax.swing.JButton(); jButton4 = new javax.swing.JButton(); jButton5 = new javax.swing.JButton(); jButton6 = new javax.swing.JButton(); jButton7 = new javax.swing.JButton(); jButton8 = new javax.swing.JButton(); jButton9 = new javax.swing.JButton(); jButton10 = new javax.swing.JButton(); jButton11 = new javax.swing.JButton(); jButton12 = new javax.swing.JButton(); jButton13 = new javax.swing.JButton(); jButton14 = new javax.swing.JButton(); jButton15 = new javax.swing.JButton(); jTextField1 = new javax.swing.JTextField();

数字图像处理实验报告

数字图像处理实验报告 实验一数字图像基本操作及灰度调整 一、实验目的 1)掌握读、写图像的基本方法。 2)掌握MATLAB语言中图像数据与信息的读取方法。 3)理解图像灰度变换处理在图像增强的作用。 4)掌握绘制灰度直方图的方法,理解灰度直方图的灰度变换及均衡化的方 法。 二、实验内容与要求 1.熟悉MATLAB语言中对图像数据读取,显示等基本函数 特别需要熟悉下列命令:熟悉imread()函数、imwrite()函数、size()函数、Subplot()函数、Figure()函数。 1)将MATLAB目录下work文件夹中的forest.tif图像文件读出.用到imread, imfinfo 等文件,观察一下图像数据,了解一下数字图像在MATLAB中的处理就是处理一个矩阵。将这个图像显示出来(用imshow)。尝试修改map颜色矩阵的值,再将图像显示出来,观察图像颜色的变化。 2)将MATLAB目录下work文件夹中的b747.jpg图像文件读出,用rgb2gray() 将其 转化为灰度图像,记为变量B。 2.图像灰度变换处理在图像增强的作用 读入不同情况的图像,请自己编程和调用Matlab函数用常用灰度变换函数对输入图像进行灰度变换,比较相应的处理效果。 3.绘制图像灰度直方图的方法,对图像进行均衡化处理 请自己编程和调用Matlab函数完成如下实验。 1)显示B的图像及灰度直方图,可以发现其灰度值集中在一段区域,用 imadjust函 数将它的灰度值调整到[0,1]之间,并观察调整后的图像与原图像的差别,调整后的灰

度直方图与原灰度直方图的区别。 2) 对B 进行直方图均衡化处理,试比较与源图的异同。 3) 对B 进行如图所示的分段线形变换处理,试比较与直方图均衡化处理的异同。 图1.1 分段线性变换函数 三、实验原理与算法分析 1. 灰度变换 灰度变换是图像增强的一种重要手段,它常用于改变图象的灰度范围及分布,是图象数字化及图象显示的重要工具。 1) 图像反转 灰度级范围为[0, L-1]的图像反转可由下式获得 r L s --=1 2) 对数运算:有时原图的动态范围太大,超出某些显示设备的允许动态范围, 如直接使用原图,则一部分细节可能丢失。解决的方法是对原图进行灰度压缩,如对数变换: s = c log(1 + r ),c 为常数,r ≥ 0 3) 幂次变换: 0,0,≥≥=γγc cr s 4) 对比拉伸:在实际应用中,为了突出图像中感兴趣的研究对象,常常要求 局部扩展拉伸某一范围的灰度值,或对不同范围的灰度值进行不同的拉伸处理,即分段线性拉伸: 其对应的数学表达式为:

嵌入式图形界面设计_综合实验报告

嵌入式图形界面设计报告 班级:计算机科学与技术15-2班 小组成员:刘航征、安宝、曲晗羽 杨祎涵、张振、李雪辰 2017年12月

一、前言 天气预报(测)或气象预报(测)是使用现代科学技术对未来某一地点地球大气层的状态进行预测。从史前人类就已经开始对天气进行预测来相应地安排其工作与生活(比如农业生产、军事行动等等)。今天的天气预报主要是使用收集大量的数据(气温、湿度、风向和风速、气压等等),然后使用目前对大气过程的认识(气象学)来确定未来空气变化。由于大气过程的混乱以及今天科学并没有最终透彻地了解大气过程,因此天气预报总是有一定误差的。 最传统的数据是在地面或海面上通过专业人员、爱好者、自动气象站或者浮标收集的气压、气温、风速、风向、湿度等数据。世界气象组织协调这些数据采集的时间,并制定标准。这些测量分每小时一次(METAR)或者每六小时一次(SYNOP)。 该项目为一款天气预报软件,基于Qt5开发,具有查询指定城市天气、显示当天天气状况以及未来四天天气大致状况的主要功能,次要功能为更换软件皮肤,显示当天感冒指数等功能。 软件预览图: 二、选用的技术基本说明 1、Qt JSON操作 QJsonDocument QJsonDocument 类用于读和写JSON 文档。 一个JSON 文档可以使用QJsonDocument::fromJson() 从基于文本的表示转化为QJsonDocument,toJson() 则可以反向转化为文本。解析器非常快且高效,并将JSON 转换为Qt 使用的二进制表示。 已解析文档的有效性,可以使用!isNull() 进行查询。 如果要查询一个JSON 文档是否包含一个数组或一个对象,使用isArray() 和isObject()。包含在文档中的数组或对象可以使用array() 或object() 检索,然后读取或操作。

实验报告四图像锐化处理

姓名:学号:班级: 实验日期:实验成绩: 一.实验目的 (1)学习如何用锐化处理技术来加强图像的目标边界和图像细节,对图像进行梯度算子、拉普拉斯算子、Sobel算子设计,使图 像的某些特征(如边缘、轮廓等)得以进一步的增强及突出。(2)分析模板大小对空域锐化滤波的影响,比较不同滤波器的处理效果,分析其优缺点。 二.实验原理 锐化处理的主要目的是突出灰度的过度部分,在空间域中,均值滤波类似于积分,那锐化滤波类似于微分,微分算子的响应程度与图像在用算子操作的这一点突变程度成正比,图像积分模糊了图像,同时起到了消除噪声的作用;图像微分增强边缘和其它突变(如噪声),而削弱灰度变换缓慢的区域,laplacian算子类似于二阶微分,强调的是图像灰度级剧烈变换的部分,而sobel算子类似于一阶微分,强调的是图像灰度级缓慢变化的部分。 三.实验内容及结果

(1)选择一副图像,分别使用拉普拉斯算子、sobel算子对图像进行锐化滤波,并观察滤波效果。 图 1 laplacian及sobel算子处理图像 (2)选择一副图像,构造一个中心系数为-24的5×5的类似于拉普拉斯模板对图像进行锐化,与上述拉普拉斯算子的结果相比,是否能得到更加清晰的结果? 图 2 不同大小laplacian模板处理原图及二值图 四.结果分析

(1)观察图一,可以发现对原图进行sobel算子运算后,原图阶梯的边缘细节被突显出来了,而每个阶梯灰度级保持不变的背景则没了,全变黑了,而对原图进行laplacian算子运算后,边缘部分则只剩下些杂乱无章的点了,基本是在sobel算子运算过后筛选出来的缓慢突变边缘上的一些突变更快的点。如果把sobel算子比作是一阶微分就不难理解它是对原图的缓慢边缘变化部分,而把laplacian算子比作是二阶微分的话,就是原图的剧烈突变部分,由于原图像的阶梯边缘在灰度级上是缓慢过度的,所以使用sobel算子边缘的突出效果更明显,而laplacian算子无论模板大小为多大,都不能清晰的显示出边缘。至于背景为什么会变黑是因为算子模板中有负因子,当计算的出来的值为负数时,自动标定其为0,也就是黑色。 (2)观察图二,可以发现对原图使用无论多大的laplacian模板,效果都很差,原因就是上述提到的原图像的边缘灰度级是缓慢变化的,对原图灰度级二值化处理,由于灰度值大小只有0和1两个值,阶梯边缘两边的值分别为0和1,这样边缘突变就成了一个单位的剧烈突变,所以3*3的laplacian算子效果就和上述的sobel算子效果相似,而当增加laplacian算子的大小到5*5时,边缘检测效果更加明显。正印证了微分算子的响应程度与图像在用算子操作的这一点突变程度成正比这一原理。

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

一、实验目的 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);

java图形界面实验报告

河南工业大学实验报告 专业班级:计科F1401 学号:姓名: 实验单元八 【实验目的】 1、掌握???????程序设计方法 2、掌握???????程序设计方法 3、掌握???????程序设计方法 4、掌握???????程序设计方法 5、掌握使用????程序设计方法。 【实验环境】 安装了jdk软件的PC机。 【实验内容】 第18章、图形界面。 【程序功能内容说明】 设置标签的显示字体、大小背景及颜色。 【实验程序原码】 import java.awt.Dimension ; import java.awt.Color ; import java.awt.Font ; import java.awt.Point ; import javax.swing.JLabel ; import javax.swing.JFrame ; public class JLabelDemo02{ public static void main(String args[]){ JFrame frame = new JFrame("Welcome To MLDN") ; JLabel lab = new JLabel("MLDN",JLabel.CENTER) ; // 实例化标签对象

Font fnt = new Font("Serief",Font.ITALIC + Font.BOLD,28) ; lab.setFont(fnt) ; frame.add(lab) ; // 将组件件入到面板之中 Dimension dim = new Dimension() ; frame.setBackground(Color.WHITE) ;//设置窗体的背景颜色 dim.setSize(200,70) ; frame.setSize(dim) ; Point point = new Point(300,200) ; // 设置坐标 frame.setLocation(point) ; frame.setVisible(true) ; } }; 【实验结果】 【该程序关键技术说明】 JFrame作为基本容器用于创建窗口。 JLabel作为标签组件用于在窗口上的显示。

实验三 二维图元的填充

实验三二维图元的填充 实验目的: 通过实验掌握下列知识: 1.熟悉OpenGL中对颜色的设置 2.边界填充算法的理解与实现; 3.泛滥填充算法的理解与实现; 4.扫描线填充算法的理解与实现; 内容及步骤: 一、OpenGL中颜色的设置 OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式。无论哪种颜色模式,计算机都必须为每一个像素保存一些数据。不同的是,RGBA模式中,数据直接就代表了颜色值;而颜色索引模式中,数据代表的是一个颜色表的索引,要得到真正的颜色,还必须到颜色表去查找。颜色索引模式主要用于早期性能差,只能显示有限颜色的显示设备上,现在由于显示设备的发展,普遍都采用RGBA模式,所以,我们只介绍RGBA模式。 RGBA模式中,每一个像素会保存以下数据:R值(红色分量)、G值(绿色分量)、B值(蓝色分量)和A值(alpha分量,就是透明度分量)。其中红、绿、蓝三种颜色相组合,就可以得到我们所需要的各种颜色,而alpha不直接影响颜色,它将留待以后介绍。 在RGBA模式下选择颜色是十分简单的事情,只需要一个函数。glColor*系列函数可以用于设置当前绘制颜色(前景色),其中三个参数的版本可以指定R、G、B的值,而A值采用默认;四个参数的版本可以分别指定R、G、B、A的值。例如: void glColor3(type r, type g, type b) void glColor3v(type * color) void glColor4(type r, type g, type b, type a) void glColor4v(type * color)

相关文档
最新文档