计算机图形学-扫描线填色程序_第1页
计算机图形学-扫描线填色程序_第2页
计算机图形学-扫描线填色程序_第3页
计算机图形学-扫描线填色程序_第4页
计算机图形学-扫描线填色程序_第5页
已阅读5页,还剩1页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

1、扫描线填色程序主程序名为fill_area(count, x, y),其中参数x, y是两个一维数组,存放多边形顶点(共count个)的x和y坐标。它调用8个子程序,彼此的调用关系如图所示。各子程序的功能为:图2.3.5 fill_area的程序结构typedef struct int y_top;float x_int;int delta_y;floaat x_change_per_scan; EACH_ENTRY;EACH_ENTRY SIDESMAX_POINT;int xMAX_POINT, yMAX_POINT;int side_count, first_s, last_s, sca

2、n, bottomscan, x_int_count, r;fill_area(count, x, y)int count, x , y ;sort_on_bigger_y(count);first_s=1;last_s=1;for (scan=sides1.y_top; scanbottomscan ?; scan - -) up date_first_and_last(count, scan); process_x_intersections(scan, first_s, last_s); draw_lines (scan, x_int_count, first_s); update-_s

3、ides_list ( ); void put_in_sides_list(entry, x1, y1, x2, y2, next_y);int entry, x1, y1, x2, y2, next_y;int maxy;float x2_temp, x_change_temp;x_change_temp = (float) (x2-x1) / (float) (y2-y1);x2_temp =x2; /*以下为退缩一点操作. */if (y2y1) & (y2next_y) y2 - - ; x2_temp - = x_change_temp; else if (y2next_y) y2+

4、; x2_temp+=x_change_temp; /* 以下为插入活性表操作. */maxy = (y1 y2)? y1: y2;while ( entry 1) & (maxy sides entry -1. y_top) sidesentry=sides entry ?; entry - -; sidesentry. y_top=maxy;sidesentry. delta_y =abs(y2-y1)+1;if (y1y2) sidesentry. x_int =x1;else sidesentry.x_int=x2_temp; sidesentry. x_change_per_scan

5、=x_change_temp; void sort_on_bigger_y(n)int n;int k, x1, y1;side_count=0;y1=yn;x1=xn;bottomscan=yn;for (k=1; kn+1; k+) if (y1 ! =yk) side_count +; put_in_sides_list(side_count, x1, y1, xk, yk); else move (short)x1, (short)y1); line(short)xk, (short)y1, status); if (yk =scan) & (last_s first_s) & (si

6、desentry. x_int sidesentry-1. x_int) swap (sidesentry, sidesentry-1); entry - -;void process_x_intersections(scan, first_s, last_s)int scan, first_s, last_s;int k;x_int_cout=0;for(k=first_s; k0) x_int_count +; sort_on_x(k, first_s);void draw_lines(scan, x_int_count, index)int scan, x_int_count, inde

7、x;int k, x, x1, x2;for (k=1; k (int) (x_int_count/2+1.5); k+) while(sidesindex. delta_y = = 0) index +; x1=(int)(sidesindex. x_int +0.5); index +; while(sidesindex.delta_y = = 0) index +; x2 = (int) (sides index. x_int +0.5); move(short)x1, (short)scan); line(short)x2, (short)scan, status); index +;

8、void update_sides_list( )int k;for (k=first_s; k0) sidesk.delta_y - -; sidesk. x_int - = sidesk. x_change_per_scan; 1、sort_on_bigger_y子程序的主要功能是按照输入的多边形,建立起活性边表。操作步骤是:对每条边加以判断:如非水平边则调用put_in_side_list子程序放入活性边来;如是水平边则直接画出。2、put_in_sides_list子程序的主要功能是将一条边存入活性边表之内。操作步骤是:对该边判别是否左顶点或右顶点,如果将入边之终点删去,按照y_top

9、的大小在活性边表中找到该点的合适位置,在该边的位置中填入数据。3、update_first_and_last子程序的主要功能是刷新活性边表的first和last两根指针的所指位置,以保证指针指出激活边的范围。4、process_x_intersections子程序的主要功能是对活性边表中的激活边(即位于first和last之间的,并且? y? 0的边)按照x_int的大小排序。操作步骤是:从first到last,对每一根? y? 0的边,调用sort_on_x子程序排入活性边表中合适位置。5、sort_on_x子程序主要功能是将一条边sideentry,在活性边表的first到entry之间按

10、x_int的大小插入合适位置。操作步骤是:检查位于entry的边的x_int是否小于位置entry-1的边的x_int,如是,调用swap子程序交换两条边的彼此位置。6、swap子程序的主要功能是交换活性边表中两条相邻位置边的彼此位置。7、draw_lines子程序的主要功能是在一条扫描线位于多边形内的部分,填上指定的色彩。操作步骤是:在活性边表的激活边范围内,依次取出y 0两边的x_int,作为两个端点(x1, scan),(x2, scan),画一条水平线。8、update_sides_list子程序的主要功能是刷新活性边表内激活边的值:y=Dy-1 x_int=x_int_x_chang_per_scan;内容总结(1)扫描线填色程序主程序名为fill_area(c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论