区域填充算法运行代码
{
Pointps = Q[i];
Pointpe = Q[(i + 1) % Q.Count];
Pointpss = Q[(i - 1 + Q.Count) % Q.Count];
Pointpee = Q[(i + 2) % Q.Count];
if(pe.Y != ps.Y)//不处理平行线
{
e =newEDGE();
e.dx = (double)(pe.X - ps.X) / (double)(pe.Y - ps.Y) * XiangSu;
if(pe.Y > ps.Y)
{
e.xi = ps.X;
if(pee.Y >= pe.Y)
e.ymax = pe.Y - XiangSu;
else
e.ymax = pe.Y;
{
}
privatevoid四联通填充ToolStripMenuItem_Click(objectsender,EventArgse)
{
tempp.X = tempP[3].X + XiangSu;//选取第4个点内侧(随机猜测)
tempp.Y = tempP[3].Y + XiangSu;
checkBox.Enabled =false;//让绘制过程中不能改变选择
///点的前一个相邻点,pee是终点的后一个相邻点,pss和pee用于辅助判断ps和pe两个
///点是否是左顶点或右顶点,然后根据判断结果对此边的ymax进行-1修正,算法实现非
///常简单,注意与扫描线平行的边是不处理的,因为水平边直接在HorizonEdgeFill()
///函数中填充了。
///</summary>
///</summary>
///<param name="NET"></param>
///<param name="ymin"></param>
///<param name="ymax"></param>
privatevoidProcessScanLineFill(List<EDGE>[] NET,intymin,intymax)
RemoveNonActiveEdgeFromAet(refAET, y);//删除非活动边
UpdateAndResortAet(refAET);//更新活动边表中每项的xi值,并根据xi重新排序
}
}
///<summary>
///负责将扫描线对应的所有新边插入到aet中,插入操作到保证AET
///还是有序表,插入排序的思想
temp.Add(pe.Y - ymin);
}
}
}
for(inti = 0; i < temp.Count; i++)
{
My_Sort(refNET[temp[i]]);
}
}
privatevoidMy_Sort(refList<EDGE> list)
{
EDGEd =newEDGE();
for(inti = 0; i < list.Count-1; i++)
NET[ps.Y - ymin].Add(e);//加入对应的NET里
temp.Add(ps.Y - ymin);
}
else
{
e.xi = pe.X;
if(pss.Y >= ps.Y)
e.ymax = ps.Y - XiangSu;
else
e.ymax = ps.Y;
NET[pe.Y - ymin].Add(e);//加入对应的NET里
privatevoidInitScanLineNewEdgeTable(List<EDGE>[] NET,List<Point> Q,intymin,intymax)
{
List<int> temp =newList<int>();
EDGEe;
for(inti = 0; i < Q.Count; i++)
///<summary>
///水平边直接画线填充
///</summary>
///<param name="Q"></param>
privatevoidHorizonEdgeFill(List<Point> Q)
{
}
///<summary>
///扫描线填充处理过程
///开始对每条扫描线进行处理,对每条扫描线的处理有四个操作
///<param name="e"></param>
privatevoidscanLineFillingToolStripMenuItem_Click(objectsender,EventArgse)
{
slf.ScanLinePolygonFill(P,g,XiangSu);
}
privatevoidlabo_check();//也要检查一遍,不然会出现错误
FloodSeedFill(tempp);
checkBox.Enabled =true;//恢复
}
///<summary>
///初始化新边表
///算法通过遍历所有的顶点获得边的信息,然后根据与此边有关的前后两个顶点的情况
///确定此边的ymax是否需要-1修正。ps和pe分别是当前处理边的起点和终点,pss是起
{
List<EDGE> AET=newList<EDGE>();//扫描线
for(inty = ymin; y < ymax; y+=XiangSu)
{
#region显示运算信息
InsertNetListToAet(NET[y-ymin],refAET);
#endregion
FillAetScanLine(refAET, y);
区域填充算法运行代码
———————————————————————————————— 作者:
———————————————————————————————— 日期:
ﻩ
///<summary>
///扫描线填充算法填充触发事件
///</summary>
///<param name="sender"></param>
{
for(intj = i + 1; j < list.Count; j++)//瞎!for (int j = i+1; i < list.Count; i++)
{
if(list[j] < list[i])
{
d = list[j];
list[j] = list[i];
list[i] = d;
}
}
}
}
///</summary>
///<param name="list"></param>