- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验六扫描线填充算法
实验六 扫描线填充算法
一、实验目的
编写多边形的扫描线填充算法程序,加深对扫描线算法的理解,验证算法的正确性。
二、实验任务(2学时)
编写多边形的扫描线填充算法程序,利用数组实现AET,考虑与链表实现程序的不同。
三、实验内容
1、算法
对一条扫描线的填充一般分为以下4个步骤:
(1)求交:计算扫描线与多边形各边的交点;
(2)排序:把扫描线上所有交点按递增顺序进行排序;
(3)配对:将第一个交点与第二个交点,第三个交点与第四个交点等等进行配对,每对交点代表扫描线与多边形的一个相交区间。
(4)着色:把区间内的像素置为填充色。
2、成员函数的关系
主程序名为fill_area(count, x, y),其中参数x, y是两个一维数组,存放多边形顶点(共count个)的x和y坐标。它调用8个子程序,彼此之间的调用关系图1所示为:
图1 fill_area的程序结构
3、算法的程序设计
步骤1:创建“S_L_Fill”工程文件;
步骤2:创建类class:“ EACH_ENTRY”。
在工作区“S_L_Fill classes”单击右键-(“new class”-(选择类型“Generic Class”名称为“EACH_ENTRY”,添加成员变量(添加至“class EACH_ENTRY { public:”之内):
int y_top;
float x_int;
int delta_y;
float x_change_per_scan;
步骤3:包含头文件,同时初始化定义多边形顶点数目。在“class CS_L_FillView : public Cview……”之前添加代码“#include EACH_ENTRY.h”及“#define MAX_POINT 9”。
#define MAX_POINT 9
#include EACH_ENTRY.h
步骤4:在类“class CS_L_FillView”中添加成员变量(鼠标双击工作区“CS_L_FillView”,代码添加至“class CS_L_FillView : public Cview {protected: ……public:之后 ”):
EACH_ENTRY sides[MAX_POINT];
int x[MAX_POINT],y[MAX_POINT];
int side_count,first_s,last_s,scan,bottomscan,x_int_count;
步骤5:利用构造函数“CS_L_FillView::CS_L_FillView()”初始化顶点坐标(鼠标双击工作区“CS_L_FillView”,代码添加至“CS_L_FillView()之内 ”):
x[0]=200;y[0]=100;
x[1]=240;y[1]=160;
x[2]=220;y[2]=340;
x[3]=330;y[3]=100;
x[4]=400;y[4]=180;
x[5]=300;y[5]=400;
x[6]=170;y[6]=380;
x[7]=120;y[7]=440;
x[8]=100;y[8]=220;
步骤6:在“class CS_L_FillView” 下添加实现不同功能的成员函数。在工作区“CS_L_FillView”上单击鼠标右键,选择“Add Member Function”,分别完成以下成员函数的添加:
(1)void put_in_sides_list(int entry,int x1,int y1,int x2,int y2,int next_y)
函数说明:put_in_sides_list子程序的主要功能是将一条边存入活性边表之内。操作步骤是:对该边判别是否左顶点或右顶点,如果将入边之终点删去,按照y_top的大小在活性边表中找到该点的合适位置,y值较大者,排在活性边表的靠前位置。
void put_in_sides_list(int entry,int x1,int y1,int x2,int y2,int next_y)// entry为剔除水平边之后的第entry条边, x1, y1,为起点, x2, y2为终点,next_y为终点相邻的下一个顶点y坐标
{
int maxy;
float x2_temp,x_change_temp;
x_change_temp=(float)(x2-x1)/(float)(y2-y1);//计算1/k
x2_temp=float(x2);
if((y2y1)(y2next_y))//x2,y2是左顶点,则( x2-1/m,y2-1)终点下缩
{
y2--;
x2_temp-=x_change_temp;
}
else
{
if((y2y1)(y2next_y))
文档评论(0)