资源描述:
《《计算机图形学教学资料》计算机图形学上机实验报告》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、计算机图形学上机实验报告11070426范元多边形的填充一、实验要求用户输入顶点坐标序列,要求使用扫描线算法。多边形顶点:(150,150,(190.200),(300,170),(1170,300)。二、实验内容1.根据多边形顶点坐标值,计算扫描线的最大值ScanMax和最小值ScanMin«2.用多边形覆盖的扫描线动态建立桶结点。3.循环多边形的所有顶点,根据边的终点y值比起点y值高或边的终点y值比起点y值低两种情况(边的终点y值和起点y值相等的情况属于扫描线,不予考虑),计算每条边的yMin。在桶屮寻找与该yMin相应的桶结点,计算
2、该边表的x
3、yMin>yMax>k(代表斜率倒数1/k),并依次连接该边表结点到桶结点。1.对每个桶结点连接的边表,根据x
4、yMin值的大小进行排序,若x
5、yMin相等,则按照k由小到大排序。2.对每个桶结点进行循环,将桶内每个结点的边表合并为有效边表,并进行有效边表循环。3.从有效边表中取出相邻两条边的交点对进行填充。填充时设置一个逻辑变量In(初始值为假),每访问一个结点,把In值取反一次,若In为真,则把从当前结点的x值开始到下一结点的x-1值结束的区间用指定颜色填充。(左闭右开)4.循坏下一桶结点,按照xi+l=xi+k(k的值为
6、1/k)修改有效边表,同时合并桶结点内的新边表,形成新的有效边表。5.如果桶结点的扫描线值大于等于有效边表中某个结点的yMax值,则放弃该有效边表。6.当桶结点不为空则转5,否则删除桶结点和边结点的头结点,算法结束。三、实验结果乂n四、实验体会通过学习计算机图形学中的有效边表填充算法,进一步了解了扫描线算法的核心思想,并通过有效边表填充算法完成了实现。并且实现了了有效边表填充算法中的各种思想。加深了对计算机图形学的理解和对知识的掌握。五、源程序由于使用的是MFC工程,其中关于头文件以及边表的定义等不再具体给出。仅给出有效边表填充算法的部分
7、。voidCTestView::PolygonFill()〃多边形填充{HeadE二NULL;for(CurrentB=Headr^;CurrentB!二NULL;CurrentB=CurrentB->next)//访问所有桶结点{for(CurrentE=CurrentB->p;CurrentE!=XULL;CurrentE=CurrentE->next)//访问桶中排序前的边结点{AET*TempEdgc=newAET;TcmpEclge->x=CurrcntE->x;TempEdge->yMax=CurrenlE->yMax;Tem
8、pEdge->k=CurrentE->k;TempEdge->next=XULL;AddEdge(TcmpEdge);//将该边插入临时Aet表}EdgeOrder();〃使得边表按照x递增的顺序存放T1二HeadE;//根据ymax抛弃扫描完的边结点if(Tl==NULL)return;whi1e(CurrentB->ScanLine>=Tl->yMax)//放弃该结点,Aet表指针后移(下闭上开){Tl=Tl->ncxt;IIeadE=Tl;if(HeadE二二NULL){return;}}if(Tl->next!=NULL){T2=
9、T1;Tl=T2->ncxt;}vh订e(Tl!二NULL){if(CurrentB~>ScanLine>=T1->yMax)//跳过一个结点{T2->next=Tl->next;Tl-〉next二NULL;T1二T2-〉next;}else{T2二Tl;Tl二T2-〉next;}}BOOLIn二false;//设置一个BOOL变量In,初始值为假doublexb,xe;//扫描线的起点和终点for(T1=HeadE;T1!=NULL;T1=T1->next)//填充扫描线和多边形相交的区间{if(In==false){xb二Tl->x
10、;In二true;//每访问一个结点,把In值取反一次}else//如果In值为真,则填充从当前结点的x值开始到下一结点的x值结束的区间{xe=Tl->x-l;//左闭右开CC1ientDCde(this);for(doublex二xb;xUxe;x++)de.SetPixel(ROUND(x),CurrentB-〉ScanLine,GetColor);//填充语句Sleep(l);//延吋1ms,提高填充过程的可视性Tn=FALSE;}for(Tl=HeadE;T1!=NULL;T1=Tl->next)//边连贯性{Tl-〉x二Tl-〉
11、x+Tl-〉k;//x二x+l/k}}deleteHeadB;deleteCurrentB;deleteCurrentE;deletelleadE;}