案例6 多边形有效边表填充算法
计算机图形学课程设计-有效边表填充算法实现

计算机图形学课程设计设计题目改进的有效边表算法对多边形的填充学院名称信息科学与技术学院专业名称计算机科学与技术学生姓名刘柯学生学号201213030112任课教师梅占勇设计(论文)成绩教务处制2015年9 月28 日目录一、设计内容与要求 (3)1.1设计题目 (3)1.2 设计内容 (3)1.3 设计目标 (3)二、总体设计 (3)2.1 多边形的表示 (3)2.2 x-扫描线算法 (4)2.3 改进的有效边表算法 (4)2.3.1 改进的有效边表算法 (4)2.3.2 有效边表 (5)2.3.3 边表 (6)三、详细设计 (8)3.1 改进的有效边表算法的实现 (8)3.2 有效边表算法程序流程图 (9)四、测试结果 (9)五、总结 (15)六、源代码 (15)参考文献 (26)一、设计内容与要求1.1设计题目用改进的有效边表算法实现多边形的填充1.2 设计内容使用OpenGL实现用改进的有效边表算法填充多边形1.3 设计目标参照课本上改进的有效边表算法的思想,实现该算法的C语言代码,并用该算法搭配OpenGL以像素点的方式绘制出给定顶点坐标的多边形。
二、总体设计2.1 多边形的表示在计算机图形学中,多边形有2种重要的表示方法:顶点表示和点阵表示。
顶点表示用多边形的顶点序列来刻画多边形,这种方法直观、几何意义强,占用内存少,应用普遍,但它没有明确指出哪些像素在多边形内,故不能直接用于面着色。
点阵表示用位于多边形内的像素的集合来刻画多边形。
这种表示法虽然失去了许多重要的几何信息,但便于运用帧缓存表示图形,是面着色所需要的图形表示形式。
大多数图形应用系统采用顶点序列表示多边形,而顶点表示又不能直接用于显示,那么就必须有从多边形的顶点表示到点阵表示的转换,这种转换称为多边形的扫描转换或多边形的填充。
即从多边形的顶点信息出发,求出位于其内部的各个像素,并将其颜色值写入帧缓存的相应单元中。
2.2 x-扫描线算法x-扫描线算法的基本思想是,按照扫描线的顺序,计算扫描线与多边形的相交区间,再用要求的颜色显示这些区间的像素,即完成填充工作。
多边形边表桶填充

实验一:改进的有效边表算法一.实验目的用鼠标描绘几个顶点,画出多边形,用边表桶的填充算法实现多边形的填充。
二.算法思想在处理一条扫描线时,仅对与它相交的多边形的边(有效边)求交,其次利用扫描线的连贯性,考虑到当前扫描线与各边的交点顺序与下一条扫描线各边的交点顺序很可能相同或者相似,因此在当前扫描线处理完毕之后,不必为下一条扫描线从头开始构造交点信息;最后利用多边形边的连贯性,认为若某条边与当前扫描线相交,则它很可能也与下一条扫描线相交且其交点与上一次的交点相交。
三.实现过程1.边表的构造1.首先构造一个纵向链表,链表长度为多边形所占有的最大扫描线数,链表的每个结点,称为,称为一个桶,对应多边形覆盖的每一条扫描线。
2.将每条边的信息装入与该边最小Y坐标(Ymin)相对应的桶中,也就是说,若某条边的较低端点为Ymin,则该边就放在相应的Y=Ymin的扫描线桶中。
3.每条边的数据形成一个结点,内容包括该扫描线与该边的初始交点X(即较低端点的X坐标),该边的最大Y 坐标值Ymax,以及边斜率的倒数1/k.4.同一桶中若干条边按x|ymin 由小到大排序,若x|ymin相等,则按照1/k由小到大排序。
2.扫描线的填充算法1.初始化。
构造边表,AET表设置为空。
2.将第一个不空的ET表中的边与AET表合并。
3.由AET表中取出的交点并进行填充,填充时候设置一个布尔量b(初值为假),令指针有效边表中的第一个结点(交点)到最后一个结点遍历一次,每访问一个结点,把b取反一次,若b为真,则把从当前结点的x值开始到下一个结点的x值结束的区间用多边形色填充,填充之后删除y=ymax的边(需注意,填充时同样为避免多边形区域的扩大化,需要多交点进行与x-扫面线算法相同的处理)。
4.y i+1=y i+1,根据x i+1=x i+1/k计算并修改AET表,同时合并ET表中y=y i+1桶中的边,按次序插入到AET 表中形成新的AET表。
六边形填充多边形算法-概述说明以及解释

六边形填充多边形算法-概述说明以及解释1.引言1.1 概述在计算机图形学中,六边形填充多边形算法是一种常用的方法,用于在离散的像素网格中填充一个给定的多边形区域。
这个算法主要的思路是利用六边形单元格来填充多边形,通过适当的规则和判断条件来确定哪些六边形单元格应该被填充,从而实现多边形的填充效果。
本文将详细介绍六边形填充多边形算法的原理、步骤以及优缺点,并结合具体的示例进行讲解。
通过深入学习和理解这一算法,读者可以更好地掌握在计算机图形学领域中处理多边形填充的技术手段,从而为实际应用场景中的图形渲染、图像处理等问题提供有效的解决方案。
1.2 文章结构:本文将首先介绍六边形填充多边形算法的概述,包括其背景和基本概念。
接着将详细讲解算法的原理,解释其实现的基本思路和机制。
然后,我们将逐步分析算法的具体步骤,包括算法的实现过程和关键步骤。
接下来,我们将探讨算法的优缺点,评价其在实际应用中的优劣势。
最后,我们将对本文进行总结,讨论六边形填充多边形算法在不同领域的应用前景,并展望未来的研究方向。
通过本文的讲解,读者将对六边形填充多边形算法有一个全面深入的了解。
1.3 目的:本文的目的是介绍六边形填充多边形算法,通过深入解析该算法的原理、步骤以及优缺点,帮助读者了解如何利用六边形填充多边形算法来有效解决填充多边形的问题。
通过本文的阐述,读者可以深入了解该算法的工作原理,从而更好地应用于实际的计算机图形学和几何方面的相关领域。
同时,本文还将探讨该算法的应用领域和未来的发展方向,旨在为读者提供对六边形填充多边形算法的全面了解,以促进该算法在实际应用中的推广和应用。
2.正文2.1 算法原理六边形填充多边形算法是一种基于六边形网格的填充算法,旨在将一个任意形状的多边形以最优方式填充为由六边形组成的图案。
该算法的原理主要包括以下几个步骤:1. 网格初始化:首先将待填充的多边形通过离散化的方式转换为六边形网格,确定网格的大小和分辨率。
带孔多边形填充算法

带孔多边形填充算法一. 基本原理用自上而下的每一条水平的扫描线扫描多边形,每一条扫描线被多边形分成几段,每一段要么在多边形内,要么在多边形外。
在内的填充,在外的舍弃。
见图1图1二. 基本算法1. 水平扫描线与线段求交点假定当前扫描线y 与多边形的某一条边的交点x 坐标为x,那么下一条扫描线y-1与该边的交点不必从头算起,只要加上一个增量即可。
设增量为dx,显然dx= -(x1-x0)/(y1-y0) 结果是:若y=y i ,x=x i ,则当y=y i -1时,x=x i -(x1-x0)/(y1-y0)图22. 活性边与活性边表为了提高效率,在处理一条扫描线时,仅对与它相交的多边形的边进行求交运算。
我们把与当前扫描线相交的边称为活性边,并把它们按与扫描线交点x 坐标递增的顺序存放在一个链表中,称此链表为活性边表。
由于边的连贯性(即当某条边与当前扫描线相交时,它很可能也与下一条扫描线相交),以及扫描线的连贯性(当前扫描线与各边的交点顺序与下一条扫描线与各边的交点顺序很可能相同或非常类似),在当前扫描线处理完毕之后,我们不必为下一条扫描线从头开始构造活性边表,而只要对当前扫描线的活性边表稍作修改,即可更新得到下一条扫描线的活性边表。
例如,(见图3)扫描线6的活性边表如下:P 6P 1 →P 6P 5→ P 5P 4 →P 4P 3扫描线4的活性边表如下:P 6P 1→P 4P 3扫描线3的活性边表如下:P 6P 1→P 3P 2 (满足上闭下开的原则)。
扫描线2的活性边表如下:P 1P 2→P 2P 3 (满足上闭下开的原则)。
y-1 (x0,y0) (x1,y1) y dx 1图3 3.Y 桶表为了方便活性边表的建立与更新,我们为每一条扫描线建立一个新边表,存放在该扫描线第一次出现的边。
也就是说,若某边的较高端点为Y max ,则该边就放在扫描线Y max 的新边表中。
这样,当我们按扫描线从大到小顺序处理扫描线时,该边在该扫描线第一次出现。
计算机图形学---多边形填充算法课件

使用更有效的数据结构
使用更有效的数据结构可以减少算法在内存中的访问次数,从而提高算法的性能。例如,可以使用边 界盒(bounding box)来加速多边形的遍历。
还可以使用索引数据结构来加速多边形的遍历,例如使用四叉树(quadtree)或八叉树(octree)。
并行化填充算法以提高性能
并行化填充算法可以将计算任务分配 给多个处理器核心,从而提高算法的 性能。例如,可以使用多线程技术来 并行化填充算法。
CHAPTER 04
填充算法的应用
在游戏开发中的应用
角色和场景渲染
多边形填充算法用于在游戏中创 建逼真的角色和场景,通过填充 多边形来模拟物体的形状和纹理
。
碰撞检测
游戏中的物体需要进行碰撞检测 ,以确保游戏的真实性和玩家的 交互体验。多边形填充算法可以 用于检测多边形之间的重叠,从
而实现碰撞检测。
地表现自然和人造物体的细节,从而丰富图形表现形式。
拓展应用领域
03
随着多边形填充算法的发展,计算机图形学将在虚拟现实、增
强现实、游戏设计、影视制作等领域得到更广泛的应用。
区域增长填充算法
区域增长填充算法是一种基于区域的填 充算法,通过将多边形内部的像素连接 起来形成一个区域,然后对该区域进行
填充。
该算法首先确定多边形的所有像素,然 后从多边形内部的一个像素开始,将其 相邻的像素加入到区域中,直到整个多
边形内部都被填充。
区域增长填充算法的优点是能够处理复 杂的填充需求,如填充不规则形状或多
种子填充算法
种子填充算法是一种基于种子点的填充算法,通过从指定的种子点开始,向周围 扩散填充颜色来实现填充。
该算法适用于任意形状的多边形,具有灵活、易于实现的特点,但可能会在处理 大型多边形时效率较低。
[VIP专享]计算机图形学 有效边表填充算法实验报告
![[VIP专享]计算机图形学 有效边表填充算法实验报告](https://img.taocdn.com/s3/m/4ea18a9689eb172ded63b7d8.png)
图 2 屏幕显示多边形 3.算法设计: (1)建立 AET 和 BUCKET 类; (2)初始化桶,并在建立桶结点时为其表示的扫描线初始化为带头结点的链表; (3)对每个桶结点进行循环,将桶内每个结点的边表合并为有效边表,并进行有效边表循 环; (4)按照扫描线从小到大的移动顺序,计算当前扫描线与多边形各边的交点,然后把这些 交点按 X 值递增的顺序进行排序,配对,以确定填充区间; (5)用指定颜色点亮填充区间内的所有像素,即完成填充工作。 4.源程序: 1)//AET.h class AET { public:
}
Bucket::~Bucket() {
}
3)//TestView.h #include "AET.h"//包含有效边表类 #include "Bucket.h"//包含桶类 #define Number 7//N 为闭合多边形顶点数,顶点存放在整型二维数组 Point[N]中 class CTestView : public CView { 。。。。。。。。。 public:
COLORREF GetColor;//调色板 CPoint Point[7];//定义多边形 Bucket *HeadB,*CurrentB;//桶的头结点和当前结点 AET E[Number],*HeadE,*CurrentE,*T1,*T2;//有效边表的结点 } (4) TestView.cpp #define ROUND(a) int(a+0.5) //四舍五入 CTestView::CTestView() { //设置多边形的 7 个顶点 Point[0]=CPoint(550,400);//P0 Point[1]=CPoint(350,600);//P1 Point[2]=CPoint(250,350);//P2 Point[3]=CPoint(350,50);//P3 Point[4]=CPoint(500,250);//P4 Point[5]=CPoint(600,50);//P5 Point[6]=CPoint(800,450);//P6 }
多边形的有效边表填充算法

实验三多边形的有效边表填充算法一、实验目的与要求1、理解多边形的扫描转换原理、方法;2、掌握有效边表填充算法;3、掌握链表的建立、添加结点、删除节点的基本方法;3、掌握基于链表的排序操作。
二、实验内容在实验二所实现工程的基础上,实现以下内容并把实现函数封装在类CMyGL 中。
1、C++实现有效边表算法进行多边形扫描转换2、利用1进行多边形扫描转换和区域填充的实现;三、实验原理请同学们根据教材及上课的PPT独立完成。
四、实验步骤(程序实现)。
1、建立并选择工程项目。
打开VC6.0->菜单File 的New 项,在projects 属性页选择MFC AppWizard(exe)项,在Project name 中输入一个工程名,如“Sample”。
单文档。
2、新建一个图形类。
选择菜单InsertNew class,Class type 选择“Generic Class”,Name 输入类名,如“CMyCG。
3、向新建的图形类中添加成员函数(实际就是加入实验要求实现的图形生成算法的实现代码)。
在工作区中直接鼠标右键单击,选择“Add Member Function…”项,添加绘制圆的成员函数。
void PolygonFill(int number, CPoint *p, COLORREF color, CDC* pDC)添加其他成员函数:CreatBucket();CreatET();AddEdge();EdgeOrder();4、成员函数的实现。
实现有效边表填充算法。
这一部分需要同学们去实现。
参考实现:多边形的有效边表填充算法的基本过程为:1、定义多边形:2、初始化桶3、建立边表4、多边形填充1)对每一条扫描线,将该扫描线上的边结点插入到临时AET表中,HeadE.2)对临时AET表排序,按照x递增的顺序存放。
3)根据AET表中边表结点的ymax抛弃扫描完的边结点,即ymax>=scanline4)扫描AET表,填充扫描线和多边形相交的区间。
有效边表填充算法

实验二有效边表填充算法实验题目:有效边表填充算法学号:姓名:班级:指导老师:完成日期: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.算法设计:多边形的有效边表填充算法的基本原理是按照扫描线从小到大的移动顺序,计算当前扫描线与多边形各边的交点,然后把这些交点按x值递增的顺序进行排序、配对,以确定填充区间,然后用指定颜色点亮填充区间的所有像素,即完成填充工作。
有效边表填充算法通过访问多边形覆盖区间内的每个像素,可以填充凸、凹多边形和环,已成为目前最为有效的多边形填充算法。
4.源程序:1)//AET.h和AET..cppclass AET{public:AET();virtual ~AET();double x;int yMax;double k; //代替1/kAET *next;}2)//Bucket.h和Bucket.cppclass Bucket{public:Bucket();virtual ~Bucket();int ScanLine;AET *p;//桶上的边表指针Bucket *next;}3) // TestView.h#include "AET.h"//包含有效边表类#include "Bucket.h"//包含桶类#define Number 7//N为闭合多边形顶点数,顶点存放在整型二维数组Point[N]中class CTestView : public CView{。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序代码
(3)填充 BOOL bInFlag=FALSE; //区间内外测试标志,初始值为假表示区间外部 double xb,xe; //扫描线与有效边相交区间的起点和终点坐标 for(pT1=pHeadE;pT1!=NULL;pT1=pT1->pNext) { if(FALSE==bInFlag) { xb=pT1->x;bInFlag=TRUE; } else { xe=pT1->x; for(double x=xb;x<xe;x++) //左闭右开 { pDC->SetPixelV(Round(x),pCurrentB-> ScanLine,RGB(pT1->ps.c.red*255, pT1->ps.c.green*255,pT1->ps.c.blue*255)); }
计算机图形学实践教程(VisualC++版)(第2版)
案例6 多边形有效边表填充算法
孔令德 太原工业学院计算机工程系 2017.1.10
知识点
有效边表和桶表的数据结构。 颜色对话框的调用方法。 动态链表的排序算法。
案例描述
请使用有效边表算法填充示例多边形。该多边形覆盖
了12条扫描线,共有7个顶点和7条边。7个顶点分别为:
FillPolygon()函数。有效边表填充算法是后续填充物体表面模
型的基础,在绘制光滑物体时,常用于填充四边形网格或三 角形网格。
程序代码
(1)定义有效边表类CAET class CAET { public: CAET(); virtual ~CAET(); public: double x; int yMax; double k; CPi2 ps; CPi2 pe; CAET *pNext; };
//当前扫描线与有效边交点的x坐标 //边的最大y值 //斜率的倒数(x的增量) //边的起点 //边的终点
原理算法
(7)从有效边表中取出扫描线上相邻两条边的结点(交点)对进行配对。填充 时设置一个逻辑变量bInFlag(初始值为假),每访问一个结点,把bInFlag值取 反一次,若bInFlag为真,则把从当前结点的x值开始到下一结点的x值结束的区 间用指定颜色填充。 (8)循环下一桶结点,按照xi+1=xi+k(k的值为1/k)修改有效边表,同时合并桶 结点内的新边表,形成新的有效边表。 (9)如果桶结点的扫描线值大于等于有效边表中某个结点的ymax值,则该边成 为无效边。 (10)当桶结点不为空则转(6),否则删除桶表和边表的头结点,算法结束。
效果图
图6-1 色。 (2)根据示例多边形顶点坐标值,计算扫描线的最大值ScanMax和最小值 ScanMin。 (3)用多边形覆盖的扫描线动态建立桶结点。 (4)循环访问多边形的所有顶点,根据边的终点y值比起点y值高或边的终点y 值比起点y值低两种情况(边的终点y值和起点y值相等的情况属于扫描线,不予 考虑),计算每条边的ymin。在桶中寻找与该ymin相对应的桶结点,计算该边表 的x|ymin、yMax、k(代表1/k),并依次链接该边表结点到桶结点。 (5)对每个桶结点链接的边表,根据x|ymin值的大小进行排序,若x|ymin相等, 则按照k(代表1/k)由小到大排序。 (6)循环访问每个桶结点,将桶内每个结点的边表合并为有效边表,并循环访 问有效边表。
P0(1,2),P1(-3,6),P2(-5,1),P3(-3,-5), P4(0,-1), P5(2,-5), P6(6,3)。在1024×768的显示分辨率下,将多边 形顶点放大为P0(50,100),P1(-150,300),P2(-250,50), P3(-150,-250) ,P4(0,-50), P5 (100,-250), P6(300,150)。
程序代码
(3)填充 bInFlag=FALSE; } } for(pT1=pHeadE;pT1!=NULL;pT1=pT1->pNext) pT1->x=pT1->x+pT1->k; } //边的连续性
总结
本案例自定义CAET、CBucket和CFill类来填充示例多边 形。调用MFC提供的CColorDialog类来选择颜色。由于使用 调色板选择的颜色范围是0~255,所以使用CRGB类设置P1 数组的顶点颜色时,全部除以255进行归一化处理,参见
程序代码
(2)定义桶类CBucket 桶表定义了多边形覆盖的扫描线数,以及边在桶上的连接位置。 class CBucket { public: CBucket(); virtual ~CBucket(); public: int ScanLine; //扫描线 CAET *pET; //桶上的边表指针 CBucket *pNext; };