作者AZHI (songs)
看板C_Sharp
标题[问题] 小画家油漆桶功能
时间Sat Sep 7 01:08:14 2013
请问小画家中的油漆桶
填满颜色的功能该如何使用
看过板上的一些文章
但还是找不到解答
请教板上大大帮忙解答 感谢
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 60.244.25.54
※ 编辑: AZHI 来自: 60.244.25.54 (09/07 01:11)
1F:→ kangkangtm:Connected Component 09/07 23:40
2F:→ as0:Flood Fill 09/08 10:13
3F:→ AZHI:请问a大 我是用Picturebox来绘图 可以达到判断颜色这个功能 09/08 11:20
现在想先利用油漆桶填满整个Picturebox
程式码如下
private void flood(int x, int y)//油漆桶mouse_move所使用
{
Rectangle rect2 = new Rectangle(x, y, 5, 5);
if (x >= 0 && x < width && y >= 0 && y < height)
{
g.FillEllipse(pencil, rect2);
flood(x + 1, y);
flood(x - 1, y);
flood(x, y + 1);
flood(x, y - 5);
}
}
下面四个flood递回函式如果只用其中一个 可以填满picturebox的 一直线的颜色
像是这样
if (x >= 0 && x < width && y >= 0 && y < height)
{
g.FillEllipse(pencil, rect2);
flood(x + 1, y);
}
如果flood函式放一个以上
就会进入无线回圈的情况...
※ 编辑: AZHI 来自: 60.244.25.54 (09/08 13:03)
4F:推 Abbee:点下去後,应记住那点颜色,再往四角度扩张,遇到不同色要 09/08 16:14
5F:→ Abbee:停止 09/08 16:14
6F:推 Abbee:没有设停止条件,会让回圈在区域内来回跑不停 09/08 16:17
我後来设了停止条件
if (color == original_color)
{
g.FillEllipse(pencil, rect2);
Draw.FillEllipse(pencil, rect2);
flood(x + 1, y, fill_color, original_color);
flood(x - 1, y, fill_color, original_color);
flood(x, y + 1, fill_color, original_color);
flood(x, y - 1, fill_color, original_color);
}
如果单跑一个flood函式(往右方扩张) 是可以的
但是往四方 或两个方向以上 就会跑入无线回圈...
※ 编辑: AZHI 来自: 60.244.25.54 (09/08 20:33)
7F:→ Litfal:你最後一块code的的color是怎麽取得的? 09/09 15:51
8F:→ AZHI:可参考Draw.Imaging~ 09/11 21:40
9F:推 Abbee:你还是没判断要画的那个点 09/13 07:42