扫描线填色算法_第1页
扫描线填色算法_第2页
扫描线填色算法_第3页
扫描线填色算法_第4页
扫描线填色算法_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论