案例9 区域八邻接点种子填充算法
- 格式:ppt
- 大小:111.13 KB
- 文档页数:6
实验2:多边形区域扫描线填充或种子填充计科102 蓝广森 1007300441一、实验目的通过实验,进一步理解和掌握几种常用多边形填充算法的基本原理掌握多边形区域填充算法的基本过程掌握在C/C++环境下用多边形填充算法编程实现指定多边形的填充。
二、实验内容及要求实现多边形区域扫描线填充的有序边表算法,并将实现的算法应用于任意多边形的填充,要求多边形的顶点由键盘输入或鼠标拾取,填充要准确,不能多填也不能少填。
要求掌握边形区域扫描线填充的有序边表算法的基本原理和算法设计,画出算法实现的程序流程图,使用C或者VC++实现算法,并演示。
三、实验原理种子填充算法又称为边界填充算法。
其基本思想是:从多边形区域的一个内点开始,由内向外用给定的颜色画点直到边界为止。
如果边界是以一种颜色指定的,则种子填充算法可逐个像素地处理直到遇到边界颜色为止。
种子填充算法常用四连通域和八连通域技术进行填充操作。
四向连通填充算法:a)种子像素压入栈中;b)如果栈为空,则转e);否则转c);c)弹出一个像素,并将该像素置成填充色;并判断该像素相邻的四连通像素是否为边界色或已经置成多边形的填充色,若不是,则将该像素压入栈;d)转b);e)结束。
扫描线填充算法的基本过程如下:当给定种子点(x,y)时,首先填充种子点所在扫描线上的位于给定区域的一个区段,然后确定与这一区段相连通的上、下两条扫描线上位于给定区域内的区段,并依次保存下来。
反复这个过程,直到填充结束。
区域填充的扫描线算法可由下列四个步骤实现:(1)初始化:堆栈置空。
将种子点(x,y)入栈。
(2)出栈:若栈空则结束。
否则取栈顶元素(x,y),以y作为当前扫描线。
(3)填充并确定种子点所在区段:从种子点(x,y)出发,沿当前扫描线向左、右两个方向填充,直到边界。
分别标记区段的左、右端点坐标为xl和xr。
(4)并确定新的种子点:在区间[xl,xr]中检查与当前扫描线y上、下相邻的两条扫描线上的象素。
基本图形的光栅化算法如何在指定的输出设备上根据坐标描述构造基本⼆维⼏何图形(点、直线、圆、椭圆、多边形域、字符串及其相关属性等)。
图形⽣成的概念图形的⽣成:是在指定的输出设备上,根据坐标描述构造⼆维⼏何图形。
图形的扫描转换:在光栅显⽰器等数字设备上确定⼀个最佳逼近于图形的象素集的过程。
直线段的扫描转换直线的绘制要求(1)直线要直;(2)直线的端点要准确,⽆定向性⽆断裂;(3)直线的亮度、⾊泽要均匀;(4)画线的速度要快;(5)具有不同的⾊泽、亮度、线型等。
解决的问题:给定直线两端点P0(x0,y0)和P1(x1,y1),画出该直线。
逐点⽐较法:数值微分法(DDA法):增量算法直观、易实现不利于⽤硬件实现x(i+1) = x(i) + 1y(i+1) = y(i) + k中点Bresenhan算法:算法原理:根据直线的斜率确定或选择变量在x或y⽅向上每次递增⼀个单位,⽽另⼀⽅向的增量为1或0,它取决于实际直线与相邻象素点的距离,这⼀距离称为误差项。
中点Bresenham算法——算法步骤输⼊直线的两端点P0(x0,y0)和P1(x1,y1)。
计算初始值△x、△y、D=△x-2△y、x=x0、y=y0。
绘制点(x,y)。
判断D的符号。
若D<0,则(x,y)更新为(x+1,y+1),D更新为D+2△x-2△y;否则(x,y)更新为(x+1,y), D更新为D-2△y。
当直线没有画完时,重复上⼀步骤,否则结束。
改进的Bresenhan算法——算法步骤1.输⼊直线的两端点P0(x0,y0)和P1(x1,y1)。
2.计算初始值△x、△y、e=-△x、x=x0、y=y0。
3.绘制点(x,y)。
4.e更新为e+2△y,判断e的符号。
若e>0,则(x,y)更新为(x+1,y+1),同时将e更新为e-2△x;否则(x,y)更新为(x+1,y)。
5.当直线没有画完时,重复步骤3和4。
否则结束。
圆的扫描转换解决的问题:绘出圆⼼在原点,半径为整数R的圆x2+y2=R2。
用A*算法解决八数码问题一、 题目:八数码问题也称为九宫问题。
在3×3的棋盘,有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同。
棋盘上还有一个空格,与空格相邻的棋子可以移到空格中。
要解决的问题是:任意给出一个初始状态和一个目标状态,找出一种从初始转变成目标状态的移动棋子步数最少的移动步骤。
二、 问题的搜索形式描述状态:状态描述了8个棋子和空位在棋盘的9个方格上的分布。
初始状态:任何状态都可以被指定为初始状态。
操作符:用来产生4个行动(上下左右移动)。
目标测试:用来检测状态是否能匹配上图的目标布局。
路径费用函数:每一步的费用为1,因此整个路径的费用是路径中的步数。
现在任意给定一个初始状态,要求找到一种搜索策略,用尽可能少的步数得到上图的目标状态算法介绍三、 解决方案介绍1.A*算法的一般介绍A*(A-Star)算法是一种静态路网中求解最短路最有效的方法。
对于几何路网来说,可以取两节点间欧几理德距离(直线距离)做为估价值,即()()()()()()**f g n sqrt dx nx dx nx dy ny dy ny =+--+--;这样估价函数f 在g 值一定的情况下,会或多或少的受估价值h 的制约,节点距目标点近,h 值小,f 值相对就小,能保证最短路的搜索向终点的方向进行。
明显优于盲目搜索策略。
A star算法在静态路网中的应用2.算法伪代码创建两个表,OPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。
算起点的估价值,将起点放入OPEN表。
while(OPEN!=NULL){从OPEN表中取估价值f最小的节点n;if(n节点==目标节点){break;}for(当前节点n 的每个子节点X){算X的估价值;if(X in OPEN){if( X的估价值小于OPEN表的估价值 ){把n设置为X的父亲;更新OPEN表中的估价值; //取最小路径的估价值}}if(X inCLOSE){if( X的估价值小于CLOSE表的估价值 ){把n设置为X的父亲;更新CLOSE表中的估价值;把X节点放入OPEN //取最小路径的估价值}}if(X not inboth){把n设置为X的父亲;求X的估价值;并将X插入OPEN表中; //还没有排序}}//end for将n节点插入CLOSE表中;按照估价值将OPEN表中的节点排序; //实际上是比较OPEN表内节点f的大小,从最小路径的节点向下进行。
第一章:(蓝色字体为部分答案)●计算机图形学的定义?计算机图形学是研究通过计算机将数据转换为图形,并在专门显示设备上显示的原理、方法和技术的学科。
●计算机图形学常见的应用领域有哪些?(应用领域的标题)●计算机图形学的相关学科有哪些?和计算机图形学互逆的学科是?●CRT中为什么需要刷新?刷新频率是什么?由于荧光物质存在余晖时间,为了让荧光物质保持一个稳定的亮度值,电子束必须不断的重复描绘出原来的图形,这个过程叫做刷新刷新频率:每秒钟重绘屏幕的次数(次/秒、HZ)●彩色CRT和单色CRT的区别:⏹在荧光屏的内表面安装一个影孔板,用于精确定位像素的位置⏹CRT屏幕内部涂有很多组呈三角形的荧光粉,每一组由三个荧光点,三色荧光点由红、绿、蓝三基色组成(一组荧光点对应一个像素)⏹三支电子枪, 分别与三基色相对应●光栅扫描显示器中帧缓存是什么?位面是什么?⏹存储用于刷新的图像信息。
也就是存储屏幕上像素的颜色值。
⏹帧缓存的单位是位面。
⏹光栅扫描显示器屏幕上有多少个像素,该显示器的帧缓存的每个位面就有多少个一位存储器●1024×1024像素组成的24位真彩色光栅扫描显示器所需要的最小帧缓存是多少?第二章●什么是CDC?在微软基类库MFC中,CDC类是定义设备上下文对象的基类,所有绘图函数都在CDC基类中定义。
⏹简述CDC的4个派生类的名称,以及作用CClientDC类:显示器客户区设备上下文类CClientDC只能在窗口的客户区(不包括边框、标题栏、菜单栏以及状态栏的空白区域)进行绘图CMetaFileDCCMetaFileDC封装了在一个Windows图元文件中绘图的方法CPaintDC类该类一般用在响应WM_PAINT消息的成员函数OnPaint()中使用CWindowDC类整个窗口区域的显示器设备上下文类,包括客户区和非客户区(即窗口的边框、标题栏、菜单栏以及状态栏)⏹什么是映射模式?映射模式定义了Windows如何将绘图函数中指定的逻辑坐标映射为设备坐标输出到显示器或者打印机上。
计算机图形学基础实验指导书目录实验一直线的生成 ............................................................... -..2.-实验二圆弧及椭圆弧的生成........................................................ -..3 -实验三多边形的区域填充 ......................................................... - (4)-实验四二维几何变换 ............................................................. -..5.-实验五裁剪算法 ................................................................. -..6.-实验六三维图形变换 ............................................................. -..7.-实验七BEZIER 曲线生成......................................................... -..8.-实验八交互式绘图技术实现........................................................ -..10-实验一直线的生成一、实验目的掌握几种直线生成算法的比较,特别是Bresenham 直线生成算法二、实验环境实验设备:计算机实验使用的语言: C 或Visual C++ 、OpenGL三、实验内容用不同的生成算法在屏幕上绘制出直线的图形,对不同的算法可设置不同的线形或颜色表示区别。
四、实验步骤直线Bresenham 生成算法思想如下1)画点(x i, y i), dx=x2-x i, dy=y2-y i,计算误差初值P i=2dy-dx , i=1;2)求直线下一点位置x i+i=x i+i 如果P i>0,贝U y i+i=y i+i,否则y i+i=y i;3)画点(x i+i ,y i+i );4)求下一个误差P i+i 点,如果P i>0,贝U P i+i=P i+2dy-2dx,否则P i+i=P i+2dy;i=i+i ,如果i<dx+i 则转步骤2,否则结束操作。
图形学复习大纲计算机图形图像学复习大纲:第一章1.关于计算机图形学的含义(填空、选择、判断)2.关于图形分类及举例3.关于图形的表示方法(两种)<概念、区别>4.图形与图像的区别5.图形学的另一种解释6.阴极射线管组成(五部分)7.什么是分辨率及特性8.习题3(图形、图像含义)第二章1.什么是CDC类(P31下)设备上下文对象的基类2.例2.4、例2.5(P35、P38)第三章1.什么是直线的扫描转换2.程序:利用中点Bresenham绘直线第四章1.多边形定义及分类,三种。
(P73)2.多边形表示方法有哪两种(顶点、点阵)及其概念3.什么是多边形扫描转换4.什么是多边形填充5.有效边表填充原则(下闭上开、左闭右开)6.什么是有效边、有效边表7.分析题:分析某个多边形关于某条扫描线的有效边表8.什么是桶表(又名边表)9.什么是边缘填充?[P80]10.什么是种子填充算法?11.什么是四/八邻接点(连通域)。
简答第五章二维变换和裁剪1.什么是图形几何变换?分为几种?2.什么是(规范化)齐次坐标?点的表达式3.三维变换矩阵的形式,和子矩阵功能:T1、T2、T3、T4形式、作用4.二维图形基本几何变换5.什么是平移(比例)变换,概念和过程?6.如何使用比例变换改变图形形状(P92中)7.什么是旋转变换(概念、结论)8.什么是反射变换(概念、3个结论矩阵)9.错切变换(概念)10.例1、例2(P95、97)11.什么是用户、观察、设备、规格化设备坐标系12.窗口、视区的关系,概念13.什么是裁剪、算法原理14.习题1.2.4(P106)第六章三维变换和投影1.三维几何变换矩阵2.平移、比例矩阵3.什么是平行投影,特点和分类?4.什么是三视图、哪三个,加以区分5.透视投影的特点6.什么是透视投影、视心、视点、视距7.透视变换坐标区包含3个(区别)8.什么是灭点、性质是什么?P1259.什么是主灭点、性质?10.什么是一、二、三点透视第七章自由变换曲线和曲面1.什么是样条曲线/面2.曲线曲面的表示形式3.什么是拟合、逼近4.什么是Bezier曲线及性质?P1375.一次、二次、三次Bezier的形状?6.Bezier性质(简答)第九章动态消隐1.什么是消隐?P1872.什么是图形的几何信息、拓扑信息?3.线框、表面实体模型的区别4.什么是消隐图5.消隐算法分类6.隐线算法原理(简答)7.隐线算法的特性8.凸面体的性质第十章真实感图形1.什么是颜色2.颜色的三要素和概念3.三刺激理论4.三原色性质5.常用颜色模型6.灰度和彩色的区分7.颜色渐变的方法8.关于直线的渐变9.三角形颜色渐变10.什么是材质第一章导论1.关于计算机图形学的含义(填空、选择、判断)?计算机图形学是一种使用图形生成原理和算法将二维或三维图形转化为光栅化的计算机显示的学科。
计算机图形学——区域填充算法(基本光栅图形算法)⼀、区域填充概念区域:指已经表⽰成点阵形式的填充图形,是象素的集合。
区域填充:将区域内的⼀点(常称【种⼦点】)赋予给定颜⾊,然后将这种颜⾊扩展到整个区域内的过程。
区域填充算法要求区域是连通的,因为只有在连通区域中,才可能将种⼦点的颜⾊扩展到区域内的其它点。
1、区域有两种表⽰形式1)内点表⽰:枚举出区域内部的所有象素,内部所有象素着同⼀个颜⾊,边界像素着与内部象素不同的颜⾊。
2)边界表⽰:枚举出区域外部的所有象素,边界上的所有象素着同⼀个颜⾊,内部像素着与边界象素不同的颜⾊。
21)四向连通区域:从区域上⼀点出发可通过【上、下、左、右】四个⽅向移动的组合,在不越出区域的前提下,到达区域内的任意象素。
2)⼋向连通区域:从区域上⼀点出发可通过【上、下、左、右、左上、右上、左下、右下】⼋个⽅向移动的组合,在不越出区域的前提下,到达区域内的任意象素。
⼆、简单种⼦填充算法给定区域G⼀种⼦点(x, y),⾸先判断该点是否是区域内的⼀点,如果是,则将该点填充为新的颜⾊,然后将该点周围的四个点(四连通)或⼋个点(⼋连通)作为新的种⼦点进⾏同样的处理,通过这种扩散完成对整个区域的填充。
这⾥给出⼀个四连通的种⼦填充算法(区域填充递归算法),使⽤【栈结构】来实现原理算法原理如下:种⼦像素⼊栈,当【栈⾮空】时重复如下三步:这⾥给出⼋连通的种⼦填充算法的代码:void flood_fill_8(int[] pixels, int x, int y, int old_color, int new_color){if(x<w&&x>0&&y<h&&y>0){if (pixels[y*w+x]==old_color){pixels[y*w+x]== new_color);flood_fill_8(pixels, x,y+1,old_color,new_color);flood_fill_8(pixels, x,y-1,old_color,new_color);flood_fill_8(pixels, x-1,y,old_color,new_color);flood_fill_8(pixels, x+1,y,old_color,new_color);flood_fill_8(pixels, x+1,y+1,old_color,new_color);flood_fill_8(pixels, x+1,y-1,old_color,new_color);flood_fill_8(pixels, x-1,y+1,old_color,new_color);flood_fill_8(pixels, x-1,y-1,old_color,new_color);}}}简单种⼦填充算法的不⾜a)有些像素会多次⼊栈,降低算法效率,栈结构占空间b)递归执⾏,算法简单,但效率不⾼,区域内每⼀像素都要进/出栈,费时费内存c)改进算法,减少递归次数,提⾼效率三、扫描线种⼦填充算法基本思想从给定的种⼦点开始,填充当前扫描线上种⼦点所在的⼀区段,然后确定与这⼀段相邻的上下两条扫描线上位于区域内的区段(需要填充的区间),从这些区间上各取⼀个种⼦点依次把它们存起来,作为下次填充的种⼦点。
八数码问题
八数码问题是一个经典的问题,也称为滑动谜题。
问题的描述是:在一个3x3的棋盘上,有1-8这8个数字和一个空格组成的九个格子,目标是通过移动数字,将棋盘上的数字按从小到大的顺序排列,空格在最后一个位置。
解决这个问题的算法主要有搜索算法,其中最常见的是A*算法。
A*算法是一种启发式搜索算法,通过建立一个状态空间图,并使用启发式函数估算每个状态到目标状态的距离,来优化搜索过程。
在八数码问题中,启发式函数可以使用曼哈顿距离来估算。
另外,也可以使用深度优先搜索、广度优先搜索、IDA*等搜索算法来解决八数码问题。
这些算法在搜索过程中以不同的方式遍历状态空间图,找到最优解。
解决八数码问题的具体步骤一般如下:
1. 定义初始状态和目标状态。
2. 使用搜索算法进行搜索,找到从初始状态到目标状态的最优解。
3. 在搜索过程中,需要注意状态的合法性和重复状态的处理。
4. 输出最优解,即一系列移动操作,将初始状态转化为目标状态。
需要注意的是,八数码问题可能存在无解的情况,需要在搜索过程中判断并处理无解情况。
此外,由于八数码问题的状态空间较大,搜索过程可能需要一定的时间和空间复杂度。
因此,在实现解决算法时,需要考虑性能优化的问题。
计算机图形学四连通区域种子填充算法实验《计算机图形学实验》报告任课教师:钱文华2016年春季学期实验:四连通区域种子填充算法实验时间:2016年12月8日实验地点:信息学院2204实验目的:掌握种子填充算法的原理,并会用种子填充算法和opengl并结合使用c++语言编写程序绘制多边形。
实验原理:种子填充算法又称为边界填充算法。
其基本思想是:从多边形区域的一个内点开始,由内向外用给定的颜色画点直到边界为止。
如果边界是以一种颜色指定的,则种子填充算法可逐个像素地处理直到遇到边界颜色为止。
内点的检测条件:if(interiorColor!=borderColor&&interiorColor!=fillColor)。
种子填充算法常用四连通域和八连通域技术进行填充操作。
从区域内任意一点出发,通过上、下、左、右四个方向到达区域内的任意像素。
用这种方法填充的区域就称为四连通域;这种填充方法称为四向连通算法。
从区域内任意一点出发,通过上、下、左、右、左上、左下、右上和右下八个方向到达区域内的任意像素。
用这种方法填充的区域就称为八连通域;这种填充方法称为八向连通算法。
一般来说,八向连通算法可以填充四向连通区域,而四向连通算法有时不能填充八向连通区域。
四向连通填充算法:a)种子像素压入栈中;b)如果栈为空,则转e);否则转c);c)弹出一个像素,并将该像素置成填充色;并判断该像素相邻的四连通像素是否为边界色或已经置成多边形的填充色,若不是,则将该像素压入栈;d)转b);e)结束。
四连通填充算法利用到了递归的思想。
本实验只包括四连通填充算法程序代码:#include<glut.h>#include<stdlib.h>#include<math.h>#include<windows.h>void init(void) { glClearColor(1.0,1.0,1.0,0.0);glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0,300.0,0.0,300.0);}void setPixel(int x,int y,long fillColor){ glColor3f(fillColor<<16,fillColor<<8,fillColor); glBegin(GL_POINTS);glVertex2i(x,y); glEnd();}void boundaryFill4(int x,int y,long fillColor,long borderColor){ unsigned char params[3];long interiorColor;glReadPixels(x,y,1,1,GL_RGB,GL_UNSIGNED_BYTE,params); interiorColor=RGB(params[0],params[1],params[2]);if(interiorColor!=borderColor&&interiorColor!=fillColor){ setPixel(x,y,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);} }void lineSegment(void) { long borderColor=RGB(255,0,0); long fillColor=RGB(0,0,255);glClear(GL_COLOR_BUFFER_BIT); glColor3f(255,0,0); glBegin(GL_LINE_LOOP);glVertex2i(0,40);glVertex2i(20,0);glVertex2i(60,0);glVertex2i(80,40);glVertex2i(60,80);glVertex2i(20,80);glEnd();boundaryFill4(60,60,fillColor,borderColor);glFlush(); }void main(int argc,char** argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowPosition(150,100);glutInitWindowSize(300,300);glutCreateWindow("种子填充");init();glutDisplayFunc(lineSegment);glutMainLoop();}上实验课时机房的实验结果:后来的实验结果:glVertex2i(0,40); glVertex2i(20,0);glVertex2i(60,0);glVertex2i(80,40);glVertex2i(60,80);glVertex2i(20,80);glEnd();boundaryFill4(60,60,fillColor,borderColor); 以上这段程序改成如下glVertex2i(90, 40);glVertex2i(120, 100);glVertex2i(90, 160);glVertex2i(60, 160);glVertex2i(60, 40);glEnd();boundaryFill4(70,60,fillColor,borderColor); 改变参数后:再把glVertex2i(90, 40);glVertex2i(120, 100);glVertex2i(90, 160);glVertex2i(60, 160);glVertex2i(60, 40);glEnd();boundaryFill4(70,60,fillColor,borderColor); 改成glVertex2i(100, 100);glVertex2i(200, 100);glVertex2i(150, 150);//glVertex2i(60, 160);//glVertex2i(60, 40);glEnd();boundaryFill4(150,120,fillColor,borderColor);后的结果如下图:实验总结:通过多组数据的测试,知道了上面算法的正确,普适性。
八数码问题,实验报告八数码实验报告利用人工智能技术解决八数码游戏问题1.八数码游戏问题简介九宫排字问题(又称八数码问题)是人工智能当中有名的难题之一。
问题是在3×3方格盘上,放有八个数码,剩下第九个为空,每一空格其上下左右的数码可移至空格。
问题给定初始位置和目标位置,要求通过一系列的数码移动,将初始位置转化为目标位置。
2.八数码游戏问题的状态空间法表示①建立一个只含有初始节点S0的搜索图G,把S0放入OPEN表中②建立CLOSED表,且置为空表③判断OPEN表是否为空表,若为空,则问题无解,退出④选择OPEN表中的第一个节点,把它从OPEN表移出,并放入CLOSED表中,将此节点记为节点n⑤考察节点n是否为目标节点,若是,则问题有解,成功退出。
问题的解就是沿着n到S0的路径得到。
若不是转⑥⑥扩展节点n生成一组不是n的祖先的后继节点,并将它们记为集合M,将M中的这些节点作为n的后继节点加入图G中⑦对未在G中出现过的(OPEN和CLOSED表中未出现过的)集合M中的节点, 设置一个指向父节点n的指针,并把这些节点放入OPEN表中;对于已在G中出现过的M中的节点,确定是否需要修改指向父节点的指针;对于已在G中出现过并已在closed表中的M中的节点,确定是否需要修改通向他们后继节点的指针。
⑧按某一任意方式或某种策略重排OPEN表中节点的顺序⑨转③3.八数码游戏问题的盲目搜索技术宽度优先搜索:1、定义如果搜索是以接近起始节点的程度依次扩展节点的,那么这种搜索就叫做宽度优先搜索(breadth-first search)。
2、特点这种搜索是逐层进行的;在对下一层的任一节点进行搜索之前,必须搜索完本层的所有节点。
3、宽度优先搜索算法(1) 把起始节点放到OPEN表中(如果该起始节点为一目标节点,则求得一个解答)。
(2) 如果OPEN是个空表,则没有解,失败退出;否则继续。
(3) 把第一个节点(节点n)从OPEN表移出,并把它放入CLOSED 的扩展节点表中。
第三章作业2.(6分)名词解释:扫描转换、增量算法、反走样。
扫描转换:基本图形的光栅化就是在像素点阵中确定最佳逼近与理想图形的像素点集,并用指定颜色显示这些像素点集的过程。
当光栅化与按扫描线顺序绘制图形的过程集合在一起时,也称为扫描转移。
增量算法:在一个迭代算法中,如果每一步X,Y值是用前一步的值加上一个增量来获得的,那么,这个算法就称为增量算法。
反走样:用于减轻走样的技术称为反走样或者称为抗锯齿。
3.(10分)计算起点坐标为(0,0),终点坐标(12,9)直线的中点Bresenham算法的每一步坐标值以及中点偏差判别式d的值,填入表3-1中,并用黑色绘制图3-29中的直线段的扫描转换像素。
图3-29 像素点阵表3-1 x,y和d的值第四章作业1.(10分)名词解释:四邻接点、八邻接点、四连通域、八连通域、种子填充算法。
四邻接点:对于多边形区域内部任意一个种子像素,其上、下、左、右这四个像素,称为四邻接点。
八邻接点:对于多边形区域内部任意一个种子像素,其上、下、左、右以及左上、左下、右上、右下这八个像素,称为八邻接点。
四连通域:对于多边形区域内部任意一个种子子素出发,通过访问其上、下、左、右这四个邻接点可以遍历区域内部的所有像素,该多边形区域称为四连通域。
八连通域:对于多边形区域内部任意一个种子子素出发,通过访问其上、下、左、右以及左上、左下、右上、右下这八个邻接点可以遍历区域内部的所有像素,该多边形区域称为八连通域。
种子填充算法:从区域内任意一个种子像素开始,由内向外将填充色扩散到整个多边形区域的填充过程。
2.(10分)试写出图4-43所示多边形的边表和扫描线y=4的有效边表。
图4-43 多边形解:ET表Y=4时的AET表3.(10分)图中已知种子O,试根据简单四连通种子填充算法按左、上、右、下入栈的顺序给出象素点填充的次序。
第五章作业1.(10分)名词解释:坐标变换、WCS、UCS、窗口、视区、窗视变换、裁剪、坐标变更:是坐标系发生变换,但物体位置不发生改变,然后在新坐标系下表示所有物体上的顶点。
启发式搜索1. 介绍八数码问题也称为九宫问题。
在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同。
棋盘上还有一个空格(以数字0来表示),与空格相邻的棋子可以移到空格中。
要求解决的问题是:给出一个初始状态和一个目标状态,找出一种从初始转变成目标状态的移动棋子步数最少的移动步骤。
所谓问题的一个状态就是棋子在棋盘上的一种摆法。
解八数码问题实际上就是找出从初始状态到达目标状态所经过的一系列中间过渡状态。
2. 使用启发式搜索算法求解8数码问题。
1) A ,A 星算法采用估价函数()()()()w n f n d n p n ⎧⎪=+⎨⎪⎩, 其中:()d n 是搜索树中结点n 的深度;()w n 为结点n 的数据库中错放的棋子个数;()p n 为结点n 的数据库中每个棋子与其目标位置之间的距离总和。
2)宽度搜索采用f(i)为i 的深度,深度搜索采用f(i)为i 的深度的倒数。
3. 算法流程① 把起始节点S 放到OPEN 表中,并计算节点S 的)(S f ;② 如果OPEN 是空表,则失败退出,无解;③ 从OPEN 表中选择一个f 值最小的节点i 。
如果有几个节点值相同,当其中有一个 为目标节点时,则选择此目标节点;否则就选择其中任一个节点作为节点i ;④ 把节点i 从 OPEN 表中移出,并把它放入 CLOSED 的已扩展节点表中;⑤ 如果i 是个目标节点,则成功退出,求得一个解;⑥ 扩展节点i ,生成其全部后继节点。
对于i 的每一个后继节点j :计算)(j f ;如果j 既不在OPEN 表中,又不在CLOCED 表中,则用估价函数f 把 它添入OPEN 表中。
从j 加一指向其父节点i 的指针,以便一旦找到目标节点时记住一个解答路径;如果j 已在OPEN 表或CLOSED 表中,则比较刚刚对j 计算过的f 和前面计算过的该节点在表中的f 值。
如果新的f 较小,则(I)以此新值取代旧值。