区域填充算法运行代码.doc
文本预览下载声明
/// summary
/// 扫描线填充算法填充触发事件
/// /summary
/// param name=sender/param
/// param name=e/param
private void scanLineFillingToolStripMenuItem_Click(object sender, EventArgs e)
{
slf.ScanLinePolygonFill(P,g,XiangSu);
}
private void label2_Click(object sender, EventArgs e)
{
}
private void 四联通填充ToolStripMenuItem_Click(object sender, EventArgs e)
{
tempp.X = tempP[3].X + XiangSu;//选取第4个点内侧(随机猜测)
tempp.Y = tempP[3].Y + XiangSu;
checkBox.Enabled = false;//让绘制过程中不能改变选择
do_check();//也要检查一遍,不然会出现错误
FloodSeedFill(tempp);
checkBox.Enabled = true;//恢复
}
/// summary
/// 初始化新边表
/// 算法通过遍历所有的顶点获得边的信息,然后根据与此边有关的前后两个顶点的情况
/// 确定此边的ymax是否需要-1修正。ps和pe分别是当前处理边的起点和终点,pss是起
/// 点的前一个相邻点,pee是终点的后一个相邻点,pss和pee用于辅助判断ps和pe两个
/// 点是否是左顶点或右顶点,然后根据判断结果对此边的ymax进行-1修正,算法实现非
/// 常简单,注意与扫描线平行的边是不处理的,因为水平边直接在HorizonEdgeFill()
/// 函数中填充了。
/// /summary
private void InitScanLineNewEdgeTable(ListEDGE[] NET, ListPoint Q, int ymin, int ymax)
{
Listint temp = new Listint();
EDGE e;
for (int i = 0; i Q.Count; i++)
{
Point ps = Q[i];
Point pe = Q[(i + 1) % Q.Count];
Point pss = Q[(i - 1 + Q.Count) % Q.Count];
Point pee = Q[(i + 2) % Q.Count];
if (pe.Y != ps.Y)//不处理平行线
{
e = new EDGE();
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;
NET[ps.Y - ymin]
显示全部