
/***************************************************/
/***********************/
/********扫描线填充算法***************/
/***********************/
/***************************************************/
算法流程:
(1) 通过确定五边形所占扫描线的最大数目,得到六边形顶点的最小Y值和最大Y值(Ymin和ymax)。
(2) 从y=ymin到y=ymax,一次填充一条扫描线。
(3) 填充扫描线的过程可分为四个过程:
A、 交叉口
B、 排序
C、 交集配对
D、 区间着色
程序代码段:
#定义N1 6/*第一个六边形顶点*/
#定义N2 3/*第二六边形顶点数*/
#定义D4/*扫描线间隔*/
空扫描填充(int x[30],int y[30])

/*********其中x[0]=0,y[0]=0放弃空间*********/
{
内景i,j
内景nn[2][2]
内景dopengl 多边形填充opengl 多边形填充,k,h
浮动xx[30],yy[30],t
内景xjd[3000],yjd[3000],xmax,xmin,ymax,ymin
n1+=1
n2+=1
毛色(6)
对于(i=1;i<;=n1-1;i++)
线(x,y,x[i+1],y[i+1])
对于(i=n1+1;i<;=n1+n2-1;i++)
线(x,y,x[i+1],y[i+1])
nn[0][0]=1
nn[0][1]=n1
nn[1][0]=n1+1
nn[1][1]=n1+n2

ymin=500
ymax=0
对于(j=0;j<;=1;j++)
{
对于(i=nn[j][0];i<;=nn[j][1];i++)
{
XX+=0.5;/*多边形顶点凹陷0.5*/
yy+=0.5
If(YY<;(float)Ymin)/*计算六边形顶点的最大值和最小值*/
ymin=(int)年
其他
如果(yy>;(float)ymax)
ymax=(整数)年
}
}
For(H=Ymin;H<;=ymax;H+=D)/*扫描线循环*/
{
k=0

For(J=0;J<;=1;J++)/*多边形循环*/
For(I=NN[J][0];I<;=NN[J][1]-1;I++)/*多边形边循环*/
{
如果((int)yy[i+1]!=(整数)年)
{
t=(浮点数)-yy)/(yy[i+1]-yy)
如果(T>;=0&T<;=1)/*扫描线h与边相交*/
{/*估计交叉口*/
xjd[k]=xx+(xx[i+1]-xx)*t
yjd[j]=h
k+=1
}
}
}
对于(I=0;I<;=k-1;k++)/*交叉排序*/
{
l=i
对于(m=i+1;m<;=k-1;m++)

如果(xjd[m]<;xjd[l])
l=m
如果(我!=一)
{
t=yjd
yjd=yjd[l]
yjd[l]=t
t=xjd
xjd=xjd[l]
xjd[l]=t
}
}
对于(I=0;I<;=k-1;I+=2)/*填充*/
{
线路(xjd、yjd、xjd[i+1]、yjd[i+1])
}
}
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-142109-1.html
不针对南海周边国家
甲午海战时