2),然后移动标识矩形到要到达的地方,确定。这样标识矩形的终止位置与初始位置存在一个偏差,水平与垂直偏差分别为dl-x,dl-y。 接下来搜索内存图素链表,确定每个图素的外接矩形,判断外接矩形是否在初始标识矩形内,若在,则将该图素的坐标属性值改变dl-x,dl-y。清除图形区,根据新的图素链表作图。 图形的删除功能类似,只需将符合条件的图素从链表中清除,再修改elementcount值即可。 拷贝图形则只需将符合条件的图素备份一个结点,修改结点的坐标属性值,再将该结点加入链表,相应增加elementcount的值。 以下为移动图形的代码。 fnmove () { rect rect; /* 定义的矩形 */ int i; selectblock (); /* 选择要移动的块 */ moveblock (); /* 移动块 */ list-temp=list-head; for (i=0;i<elementcount; i++) { getrect (&rect, list-temp); /* 计算list-temp所指图素的外接矩形 */ if (inblock(rect.x1,rect.x2,rect.y1.rect.y2)) /* 判断外接矩形是否在所选块内 */ change (list-temp, dl-x,dl-y); /* 改变图素的坐标属性 */ list-temp=list-temp->next; } clearscreeen (); /* 清除作图区 */ drawlink (); /* 依据图素链表画图 */ } 其中,change ( )可以实现如下。 change(elementlist *ctemp, int dl-x,int dl-y) { switch (ctemp->elementtype) { case c: ctemp->element.circle.x+=dl-x; ctemp->element.circle.y+=dl-y; break; case b: ctemp->element.box.x1+=dl-x; ctemp->element.box.x2+=dl-x; ctemp->element.box.y1+=dl-y; ctemp->element.box.y2+=dl-y; break; case l: ctemp->element.line.x1+=dl-x; ctemp->element.line.y1+=dl-y; ctemp->element.line.x2+=dl-x; ctemp->element.line.y2+=dl-y; break; case s: ctemp->element.string.x+=dl-x; ctemp->element.string.y+=dl-y; break; . . . } } 三、文件功能的实现 存盘时,打开文件,写入图形的背景颜色,写入图素个数elementcount,再将内存链表中各图素的属性值依次写入文件即可。 读盘时,在内存中动态建立图素链表,将文件中的图素属性值依次放入链表中,再根据背景颜色、图素属性值在屏幕上显示图形。 存盘过程实现如下。 savefile(char * filename) { file *fp; int i; list-temp=list-head; eid=0; if((fp=fopen(filename,w+b))==null) { printf (%s, cantt open the file ); exit(1); } fwrite(&back-color, sizeof(char),1,fp); fwrite(&elementcount,sizeof(int),1,fp); for(i=0;i<elementcount;i++) { list-temp->elementid=eid; fwrite(list-temp,sizeof(elementlist),1,fp); list-temp=list-temp->next; eid++; } fclose(fp); } 四、应用程序编程接口 应用程序编程接口主要功能是读图形文件并显示,对画面图素进行动态刷新。这些接口均以函数形式出现,供控制应用程序调用。 1.draw-chart (char * filename)功能:读图形文件,在内存中建立图素链表,显示图形。 2.change-chart(int element-id, int how)功能:改变图素element-id的特性,怎样改变由how决定。该接口能方便地实现图形的动态刷新。 3.clear-chart( )功能:释放图素链表占用的内存。 4.draw ( char * filename)功能:不建立链表,边读图形文件,边显示。该函数不占用内存,适用于图素多、数据文件较大,而又不需动态刷新的图形画面显示。 作者:汪建平 陆志才
上一页 [1] [2]