作者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