多边形填充算法运行代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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;//恢复

}

///

///下拉框选择像素回调函数

///

///

///

private void PortList_SelectedIndexChanged(object sender, EventArgs e)

{

XiangSu = 2 * PortList.SelectedIndex + 2;//根据下拉框选择绘制像素

}

///

///洪泛填充[注入填充]

///将所有联通区域内某种指定颜色的点都替换成另一种颜色

///边界填充:只要是边界内的点无论是什么颜色,都替换成指定的颜色

///

///

///

private void floodFillAlgorithmToolStripMenuItem_Click(object sender, EventArgs e)

{

}

///

///当选择2*2填充时会栈溢出

///

///

void FloodSeedFill(Point a)

{

if (a.X < XiangSu / 2 || a.X > 508 || a.Y < XiangSu / 2 || a.Y > 440) return;//边界情况

if(Vram[a.X + a.Y*600]==false)

{

Rectangle rect = new Rectangle(a.X - XiangSu / 2, a.Y - XiangSu / 2, XiangSu, XiangSu);

g.FillEllipse(red, rect);

Vram[a.X + a.Y * 600] = true;//标记已经走过

if (checkBox.Checked == true)

for (int i = 0; i < 4; i++)

{

tempp.X = a.X + direction_4[i].X;

tempp.Y = a.Y + direction_4[i].Y;

FloodSeedFill(tempp);

}

else

for (int i = 0; i < 8; i++)

{

tempp.X = a.X + direction_8[i].X;

tempp.Y = a.Y + direction_8[i].Y;

FloodSeedFill(tempp);

}

}

}

///

///扫面线多边形扫描算法

///

///多边形点链表

public void ScanLinePolygonFill(List Q, Graphics g, int XiangSu)

{

this.XiangSu = XiangSu;

this.g = g;

List[] NET = new List[500];//定义新边表

for (int i = 0; i < 500; i++) NET[i] = new List();//实例化

int ymax=0, ymin=0;//多边形y的最大值和最小值

GetPolygonMinMax(Q, out ymax, out ymin);//计算更新ymax和ymin(ok)

InitScanLineNewEdgeTable(NET, Q, ymin, ymax);//初始化新边表

HorizonEdgeFill(Q); //水平边直接画线填充

ProcessScanLineFill(NET, ymin, ymax);

}

///

///获得更新多边形ymax和ymin

///

///

///

///

private void GetPolygonMinMax(List Q, out int ymax, out int ymin) {

ymax = -1;

ymin = 1000;

for (int i = 0; i < Q.Count; i++)

{

if (Q[i].Y > ymax) ymax = Q[i].Y;

if (Q[i].Y < ymin) ymin = Q[i].Y;

}

}

相关文档
最新文档