#include <iostream.h> #include <GL/glut.h> //#include<Windows.h> #include <math.h> #include <stdlib.h> //#pragma comment(lib, "Kernel32.lib") #define ROUND(a) ((int)(a+0.5)) #define M 8 //定义多边形的顶点数+1 #define maxx 600 #define maxy 400 int max,min; GLsizei winWidth = 600, winHeight = 400; float myabs(float aa) { return aa>0 ? aa:aa*(-1); } struct active_edge_table { //定义新边表的链表结点数据 float x; float m; int ymin; struct active_edge_table *next; }; struct active_edge_table *NET[maxy]; //定义新边表的Y桶指针数组 struct active_edge_table *insert_node(struct active_edge_table *head, struct active_edge_table *stud); //活化边表插入结点操作 struct active_edge_table * del_node(struct active_edge_table * head,int ys); //活化边表删除结点 int y_min(int a[]); //取数组的最小值 int y_max(int a[]); //取数组的最大值 void polyNet(int px[M],int py[M]); //创建新边表的Y桶指针数组函数 int y_min(int a[]) { int j,min; min=a[0]; for(j=1;j<M-1;j++) if(a[j]<min)min=a[j]; return(min); } int y_max(int a[]) { int j,max=a[0]; for(j=1;j<M-1;j++) if(a[j]>max)max=a[j]; return(max); } //创建新边表的Y桶指针数组函数 void polyNet(int px[],int py[]) { //请同学们完成创建新边表的Y桶指针数组函数; int ymin,ymax; ymin=y_min(py); ymax=y_max(py); int j=0,i=0,m=0; for(int y=ymax;y>=ymin;y--) { for(j=0;j<M-1;j++) if(py[j]==y) { if(j==0) { if(py[j+1]<py[j]&&py[M-2]<py[j]) { struct active_edge_table aa; struct active_edge_table bb; aa.m=float(px[j+1]-px[j])/(py[j+1]-py[j]); aa.m=myabs(aa.m); if(px[j+1]>px[j]) aa.m=myabs(aa.m); else aa.m=aa.m*(-1); aa.x=px[j]+aa.m; aa.ymin=py[j+1]; bb.m=float(px[M-2]-px[j])/(py[M-2]-py[j]); bb.m=myabs(bb.m); if(px[M-2]>px[j]) bb.m=myabs(bb.m); else bb.m=bb.m*(-1); bb.x=px[j]+bb.m; bb.ymin=py[M-2]; bb.next=NULL; struct active_edge_table *p; if(NET[y-1]==NULL) { NET[y-1]=new struct active_edge_table; NET[y-1]->m=aa.m; NET[y-1]->x=aa.x; NET[y-1]->ymin=aa.ymin; NET[y-1]->next=new struct active_edge_table; NET[y-1]->next->m=bb.m; NET[y-1]->next->ymin=bb.ymin; NET[y-1]->next->x=bb.x; NET[y-1]->next->next=bb.next; } else { p=NET[y-1]; while(p->next!=NULL) { p=p->next; } p->next=new struct active_edge_table; struct active_edge_table *q; q=p->next; q->m=aa.m; q->x=aa.x; q->ymin=aa.ymin; q->next=new struct active_edge_table; q->next->m=bb.m; q->next->ymin=bb.ymin; q->next->x=bb.x; q->next->next=bb.next; } continue; } if(py[j+1]>py[j]&&py[M-2]>py[j]) continue; if(py[j+1]>py[j]&&py[M-2]<py[j]) { struct active_edge_table bbb; bbb.m=