Заливка замкнутой области<BR>Пример показывает один из самых простых и эффективных способов заливки. Использовать его в таком варианте не рекомендую, рисовать на TImage->Canvas довольно медленно, но в качестве примера очень удобно.
Процедура последовательно просматривает соседние точки, и если они не залиты, то заливает и добавляет 4 соседние точки в очередь, на рассмотрение. И так пока очередь не кончится.
На рисунке черными стрелками показаны точки, которые будут добавлены в очередь для просмотра, а красными, которые не будут добавлены, так как уже залиты.

<BR>

<BR>

<BR> <BR>Теперь собственно - исходник. (Borland C++ Builder). На форме достаточно иметь TImage - Image1.
<BLOCKQUOTE><font size="1" face="MS Sans Serif, Verdana, Helvetica, sans-serif">code:</font><HR><pre><BR>void ImageFill(short x, short y, TColor color) {<BR> // Получим размеры изображения<BR> int imw=Form1->Image1->Width;<BR> int imh=Form1->Image1->Height;<BR> // Выделим памяти для складирования координат, которые еще предстоит залить<BR> int STACK_SIZE=(imw+2)*(imh+2);<BR> short *floodfill_stackx=(short*)malloc(STACK_SIZE*sizeof(short));<BR> short *floodfill_stacky=(short*)malloc(STACK_SIZE*sizeof(short));<BR> if (floodfill_stacky==NULL || floodfill_stackx==NULL) return;<BR> int stack_head=0;<BR> int stack_tail=0;<BR> TColor clr=Form1->Image1->Canvas->Pixels[x][y];<BR> floodfill_stackx[stack_head]=x;<BR> floodfill_stacky[stack_head]=y;<BR> Form1->Image1->Canvas->Pixels[x][y]=color;<BR> stack_head++;<BR> // Пока не кончится память или точки на изображении<BR> while (stack_head<STACK_SIZE && stack_head>stack_tail) {<BR> x=floodfill_stackx[stack_tail];<BR> y=floodfill_stacky[stack_tail];<BR> stack_tail++;<BR> if (x>=0 && y>=0 && x<imw && y<imh) {<BR> // Проверим точку справа, если она не залита, то зальем<BR> if (Form1->Image1->Canvas->Pixels[x+1][y]==clr) {<BR> floodfill_stackx[stack_head]=x+1;<BR> floodfill_stacky[stack_head]=y;<BR> Form1->Image1->Canvas->Pixels[x+1][y]=color;<BR> stack_head++;<BR> }<BR> // Проверим точку слева, если она не залита, то зальем<BR> if (Form1->Image1->Canvas->Pixels[x-1][y]==clr) {<BR> floodfill_stackx[stack_head]=x-1;<BR> floodfill_stacky[stack_head]=y;<BR> Form1->Image1->Canvas->Pixels[x-1][y]=color;<BR> stack_head++;<BR> }<BR> // Проверим точку снизу, если она не залита, то зальем<BR> if (Form1->Image1->Canvas->Pixels[x][y+1]==clr) {<BR> floodfill_stackx[stack_head]=x;<BR> floodfill_stacky[stack_head]=y+1;<BR> Form1->Image1->Canvas->Pixels[x][y+1]=color;<BR> stack_head++;<BR> }<BR> // Проверим точку сверху, если она не залита, то зальем<BR> if (Form1->Image1->Canvas->Pixels[x][y-1]==clr) {<BR> floodfill_stackx[stack_head]=x;<BR> floodfill_stacky[stack_head]=y-1;<BR> Form1->Image1->Canvas->Pixels[x][y-1]=color;<BR> stack_head++;<BR> }<BR> }<BR> }<BR> Form1->Image1->Canvas->TextOutA(1,1,IntToStr(stack_head));<BR> // Освободим память<BR> free(floodfill_stacky);<BR> free(floodfill_stackx);<BR> }
void __fastcall TForm1::Button1Click(TObject *Sender) {<BR> Image1->Canvas->Ellipse(20,20,300,200);<BR> ImageFill(1,1,0xFF0000);<BR> }<BR></pre><HR></BLOCKQUOTE>