1、边相关扫描线多边形填充算法M 文件代码:function scanedge(X,Y)s,sY=size(Y);maxY=max(Y);minY=min(Y);%奇异点Y1=Y;if (Y(sY)Y(1)endif (Y(sY-1)Y(sY)endfor i=2:sY-1if (Y(i-1)Y(i)endend%画出多边形hold on;plot(X(1),X(sY),Y(1),Y(sY),r);plot(X,Y,r);axis equal;grid on;%建 ET表Edge=zeros(sY);ET=cell(maxY,1);for i=minY:maxYA=find(Y=i);sA=siz
2、e(A);k=1;for j=1:sA(2)%扫描到 P1点时if A(j)=1if X(sY)AET1,2(1,2)Change=AET1,1;AET1,1=AET1,2;AET1,2=Change;endfor i=ceil(AET1,1(1,2):floor(AET1,2(1,2)plot(i,1,b.,markersize,60);endm=2;for i=minY+1:maxYif isempty(ETi,1)for j=1:m;Change1,j=AETi-1,j;endk=2;while k=mif Change1,k-1(1,2)=Change1,k(1,2)for j=k-1
3、:m-2Change1,j=Change1,j+2;endk=k-2;m=m-2;endk=k+2;endfor j=1:mAETi,j=Change1,j;AETi,j(1,2)=Change1,j(1,2)+Change1,j(1,3);endelseif isempty(ETi,2)if AETi-1,1(1,2)+AETi-1,1(1,3)=ETi,1(1,2)AETi,1=ETi,1;for j=2:mAETi,j=AETi-1,j;AETi,j(1,2)=AETi-1,j(1,2)+AETi-1,j(1,3);endendif AETi-1,m(1,2)+AETi-1,m(1,3)
4、ETi,1(1,2)for j=1:m;Change1,j=AETi-1,j;endk=2;while k=mif Change1,k-1(1,2)=Change1,k(1,2)for j=k-1:m-2Change1,j=Change1,j+2;endk=k-2;m=m-2;endk=k+2;endfor j=1:mAETi,j=Change1,j;AETi,j(1,2)=Change1,j(1,2)+Change1,j(1,3);endendelseif AETi-1,1(1,2)+AETi-1,1(1,3)ETi,2(1,2)if m=2m=4;AETi,1=AETi-1,1;AETi,
5、1(1,2)=AETi-1,1(1,2)+AETi-1,1(1,3);AETi,2=ETi,1;AETi,3=ETi,2;AETi,4=AETi-1,2;AETi,4(1,2)=AETi-1,2(1,2)+AETi-1,2(1,3);elsefor j=2:2:mif AETi-1,j-1(1,2)+AETi-1,j-1(1,3)ETi,2(1,2)m=m+2;for k=1:j-1AETi,k=AETi-1,k;AETi,k(1,2)=AETi-1,k(1,2)+AETi-1,k(1,3);endAETi,j=ETi,1;AETi,j+1=ETi,2;for k=j+2:mAETi,k=AE
6、Ti-1,k-2;AETi,k(1,2)=AETi-1,k-2(1,2)+AETi-1,k-2(1,3);endj=m;endendendendendendfor j=2:2:mfor k=ceil(AETi,j-1(1,2):floor(AETi,j(1,2)plot(k,i,b.,markersize,60);endendend测试代码与输出图像:X=6,8,6,2,2;Y=7,5,1,3,6;scanedge(X,Y)figure 1X=2,6,10,10,4,2;Y=1,1,3,8,5,7;scanedge(X,Y)figure 2X=2,6,10,10,4,2,1;Y=1,1,3,8,5,7,6;scanedge(X,Y)figure 3X=2,6,10,10,8,6,4,2;Y=1,1,3,7,6,7,5,7;scanedge(X,Y)figure 4X=2,6,10,10,8,6,4,2,1;Y=1,1,3,7,6,7,5,7,6;scanedge(X,Y)figure 5结果分析:前四幅图表明程序对于简单的多边形填充是正确的,但由第五幅图可知当 ET 表中有超过 2 列时将无法正确填充,问题出在程序结构的简单,不具有迭代性。