- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
带孔多边形填充算法-Read
带孔多边形填充算法
基本原理
用自上而下的每一条水平的扫描线扫描多边形,每一条扫描线被多边形分成几段,每一段要么在多边形内,要么在多边形外。在内的填充,在外的舍弃。见图1
图1
基本算法
水平扫描线与线段求交点
假定当前扫描线y与多边形的某一条边的交点x坐标为x,那么下一条扫描线y-1与该边的交点不必从头算起,只要加上一个增量即可。设增量为dx,显然dx= -(x1-x0)/(y1-y0)
结果是:若y=yi ,x=xi,则当y=yi-1时,x=xi-(x1-x0)/(y1-y0)
(x0,y0)
(x0,y0)
y
y
11
1
1
y-1
y-1
dx
dx
(x1,y1)
(x1,y1)
图2
活性边与活性边表
为了提高效率,在处理一条扫描线时,仅对与它相交的多边形的边进行求交运算。我们把与当前扫描线相交的边称为活性边,并把它们按与扫描线交点x坐标递增的顺序存放在一个链表中,称此链表为活性边表。
由于边的连贯性(即当某条边与当前扫描线相交时,它很可能也与下一条扫描线相交),以及扫描线的连贯性(当前扫描线与各边的交点顺序与下一条扫描线与各边的交点顺序很可能相同或非常类似),在当前扫描线处理完毕之后,我们不必为下一条扫描线从头开始构造活性边表,而只要对当前扫描线的活性边表稍作修改,即可更新得到下一条扫描线的活性边表。
例如,(见图3)
扫描线6的活性边表如下:P6P1 ?P6P5? P5P4 ?P4P3
扫描线4的活性边表如下:P6P1?P4P3
扫描线3的活性边表如下:P6P1?P3P2 (满足上闭下开的原则)。
扫描线2的活性边表如下:P1P2?P2P3 (满足上闭下开的原则)。
P4(11,8)9
P4(11,8)
9
y
P6(2,7)
P6(2,7)
8
7
7
6
6
5
5
P5(5,5)
P5(5,5)
4
P3(11,3)
P3(11,3)
3
P2(5,1)2
P2(5,1)
2
P1(2,2)1
P1(2,2)
1
11109876543210
11
10
9
8
7
6
5
4
3
2
1
0
x
x
图3
3.Y桶表
为了方便活性边表的建立与更新,我们为每一条扫描线建立一个新边表,存放在该扫描线第一次出现的边。也就是说,若某边的较高端点为Ymax,则该边就放在扫描线Ymax的新边表中。这样,当我们按扫描线从大到小顺序处理扫描线时,该边在该扫描线第一次出现。我们把这样的表称为Y桶表。
例如,图3的多边形可以产生以下的Y桶表。
Y
Ymax
8
8
7
3
2
P4P5
P4P3
P6P1
P6P5
P3P2
P1P2
图4 : Y桶表
数据结构
/*多边形边表*/
typedef struct LINE{
int y; /*边所交的最高扫描线号(顶点的最大y值)*/
double x; /*当前扫描线与边的交点x值*/
double dx; /*从当前扫描线到下一扫描线之间的x增量*/
int dy; /*边的两个顶点的y差值=0*/
struct LINE *next; /*下一条边*/
}LINE;
/*Y桶表*/
typedef struct Y_TUB{
int y; /*该桶最大值*/
struct Y_TUB *next; /*下一桶*/
struct LINE *line; /*该桶的边表*/
}Y_TUB;
/*活性边表*/
typedef struct EXP_LINE{
int y; /*当前扫描线*/
struct LINE *line; /*活性边*/
}EXP_LINE;
算法步骤
首先生成如图4的多边形Y桶表
取Y桶的Ymax值最大的一桶(或第一桶)的边表作为活性边表。取该桶的Ymax为第一条扫描线。
清除活性边表中的水平线(水平边出链)及dy=0的边。
计算出交点序列,并按点列x坐标递增重排点列,由点列中奇数点依次连线到偶数点(如1-2,3-4,5-6 …),即可填充该扫描线所在行。注意在连线填充时,最右边一点不要填充,以达到左闭右开的结果。
扫描线下移,即y=y-1;
修改当前活性边表,如果下一桶存在并且y值等于下一桶的Ymax ,则在活性边表后加入下一桶的边表(下一桶边表入链)。
重复3-6步,直到当前活性边表为空。
(注:该算法由于最后一条扫描线使活性边的dy=0而不处理,这就产生了上闭下开的结果)
您可能关注的文档
- 坐位手术下TEE监测右心房水平反常性动脉空气栓塞一例病例报道.PDF
- 坜新医院健检中心2017~2018健康99-全国公教健检方案B检查.DOC
- 培养方案试行-河北中医学院.DOC
- 坏死破裂发病机制BP↑缺血缺氧出血→血肿→颅内容积↑↓↓↓脑.PPT
- 垂直方向三个腔室-将脱垂量化到各个腔室前anterior中middle后.PPT
- 城综合管廊施工技术标准-中国建筑业协会.DOC
- 基因变异与个人化医疗.PDF
- 塑料逐渐成为医疗技术场主角-苍南塑料行业协会.DOC
- 填空题每空1分共23分26在社区筛选健康问题时主要按重要.DOC
- 复件复件申报项目答辩顺序-齐齐哈尔医学院.DOC
- 2-红河州建筑施工安全生产标准化工地复核评分表(2022年修改版).docx
- 6.锡通项目2018年下半年工作会汇报材料(2018.7.9).docx
- 2018道路工程知识点汇总(新版).docx
- 附件3:月度生产例会安全汇报资料-站台门项目部.docx
- 附件2:广东建工集团2018年度科技成果汇总表.DOC
- 马武停车区、三汇停车区停车位管理系统,0#台账缺量.doc
- 攀成钢委办发〔2015〕19号(党风廉政建设责任考核与追究办法).doc
- 1-红河州建筑工程质量管理标准化复核评分表(2022年修改版).docx
- 中交第三公路工程局第四工程分公司项目经济合同结算管理办法(修订).doc
- 厂站安全操作规程汇编.doc
文档评论(0)