版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、扫描线填色算法1、基本原理见幻灯2、多边形区域填充步骤(1)输入欲填充多边形的顶点数及其顶点坐标。这里,顶点数为实际顶点 数加1,最后一个顶点坐标与第一个顶点坐标相同。(2)计算所有多边形顶点坐标中y的最大值和最小值,以此作为扫描线的 处理范围。(3)对处理范围内的每条扫描线建立有序边表。(4)对处理范围内的每条扫描线重复下列步骤:用有序边表建立当前扫描线的活化边表;从活化边表中依次取出一对交点,对该两个交点内的像素进行填充;为下一条扫描线更新活化边表,即增加交点的x值和删除不再相交的 边。重排活化边表。3、数据结构活化边表结点数据结构可以定义为:typedef struct tEdgeflo
2、at x ;/*当前扫描线与边的交点的x值*/float dx ;/*从当前扫描线到下一条扫描线之间的x增量*/int ymax ; /*边所交的最高扫描线号*/Edge;4、有序边表填充算法的C语言描述#includegraphics.h”#define WINDOW_HEIGHT 480#define NULL 0typedef struct tEdge /*设置有序边表和活化边表数据结构*/int ymax;float x, dx;struct tEdge *next;Edge;typedef struct point int x,y;POINT;/*按交点X的升序对边进行插入排序*/v
3、oid InsertEdge(Edge * list,Edge * edge) /*list 为有序边表,edge 为待插入的 边*/Edge * p,*q=list;p=q-next;while(p!=NULL) if(edge-xx)p=NULL; /*停止循环,edge应插入到链表的头*/else /* 遍历 list */ q=p;p=p-next;edge-next=q-next; /*q指向edge应插入位置的前一个结点,edge插入到 q之后*/q-next=edge;/*计算下一条非水平线的y值*/int yNext(int k,int cnt,POINT * pts)int
4、j;if(k+1)(cnt-1)j=0;elsej=k+1;while(ptsk.y=ptsj.y)if(j+1)(cnt-1)j=0;elsej+;return(ptsj.y);/*生成有序边表的一条边*/void MakeEdgeRec(POINT lower,POINT upper,int yComp,Edge * edge,Edge * edges) edge-dx=(float)(upper.x-lower.x)/(upper.y-lower.y);edge-x=lower.x;if(upper.yymax=upper.y-1;elseedge-ymax=upper.y;Insert
5、Edge(edgeslower.y,edge);/*建立有序边表,每次从顶点数组中取出两个点,调用MakeEdgeRec来生 成一条边,并调用InsertEdge把建好的边插入到有序边表中*/void BuildEdgeList(int cnt,POINT * pts, Edge * edges)Edge *edge;POINT v1,v2;int i,yPrev=ptscnt-2.y;v1.x=ptscnt-1.x;v1.y=ptscnt-1.y;for(i=0;icnt;i+) v2=ptsi;if(v1.y!=v2.y)/* nonhorizontal line */edge=(Edge
6、 *)malloc(sizeof(Edge);if(v1.ynext;while(p) q=p-next;InsertEdge(active,p);p=q;void FillScan(int scan,Edge * active,int color) /* 对当前扫描线填充*/Edge *p1, *p2;int i;p1=active-next;while(p1)p2=p1-next;for(i=p1-x;ix;i+)putpixel(int)i,scan,color);p1=p2-next;void DeleteAfter(Edge *q) /* 删除不再相交的边*/Edge *p=q-ne
7、xt;q-next=p-next;free(p);/*Delete completed edges. Update xIntersect field for others */void UpdateActiveList(int scan,Edge * active) /* 为下一条扫描线进行更新*/Edge *q=active,*p=active-next;while(p)if(scan=p-ymax) /*如果当前扫描线scan的值大于p所指向的边的 ymax,则删除该边*/ p=p-next;DeleteAfter(q);else /*否则p所指向的边的x值加一个dx */ p-x=p-x
8、+p-dx;q=p;p=p-next;void ResortActiveList(Edge * active) /*重排活化边表*/Edge *q,*p=active-next;active-next=NULL;while(p) q=p-next;InsertEdge(active,p);p=q;void ScanFill(int cnt,POINT *pts,int color) /* cnt 为多边形的顶点数,pts 为顶点坐标数组*/Edge * edgesWINDOW_HEIGHT,*active;int i, scan, scanmax = 0, scanmin = WINDOW_HEIGHT;for (i = 0; i cnt-1; i+) /*求填充区域的扫描线最大值scanmax和最小 值 scanmin*/ if (scanmax pts i.y ) scanmin = pts i.y;for(scan=scanmin;scannext=NULL;BuildEdgeList(cnt,pts,edges); /*用顶点坐标pts建立有序边表,放在 edges 中*/active=(Edge *)malloc(sizeof(Edge); /* 初始化活化边表*/ active-next=NULL;for(scan=sca
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 阿拉善2025年内蒙古阿拉善盟融媒体中心引进摄像制作急需紧缺人才笔试历年参考题库附带答案详解
- 邯郸河北邯郸魏县招聘警务辅助岗位120人笔试历年参考题库附带答案详解
- 蚌埠2025年安徽蚌埠固镇县职业技术学校招聘教师42人笔试历年参考题库附带答案详解
- 湘西2025年湖南湘西州龙山县委政法委所属事业单位选调笔试历年参考题库附带答案详解
- 河南2025年河南郑州铁路职业技术学院招聘17人笔试历年参考题库附带答案详解
- 杭州浙江杭州市体育局所属事业单位杭州市水上运动中心招聘编外聘用人员笔试历年参考题库附带答案详解
- 广西2025年广西医科大学第二附属医院医技药人才招聘笔试历年参考题库附带答案详解
- 宿州2025年安徽宿州灵璧县村卫生室(社区卫生服务站)人员招聘68人笔试历年参考题库附带答案详解
- 宁德2025年福建福安市教育局招聘紧缺急需及高层次人才笔试历年参考题库附带答案详解
- 职业人群健康数据价值挖掘
- 外研版八年级上册英语知识点归纳总结
- 第二类医疗器械经营备案企业质量管理制度、工作程序目录
- 生产与运作管理试题及答案
- 广东省2025年普通高等学校招生全国统一考试模拟测试(一)语文试题及答案
- 江苏省无锡市2024-2025学年高一上学期期末化学试题
- 2025年统编版五年级上册语文期末专项训练:字音、字形、字义(含答案)
- 2025年人社窗口工作总结范文(二篇)
- 睡眠对考试的重要性
- 郑东新区写字楼市场调研报告
- 网络舆情态势感知系统-洞察分析
- 亚马逊运营全知识培训
评论
0/150
提交评论