多边形填充算法运行代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
{
this.XiangSu = XiangSu;
this.g = g;
List
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
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;
}
}