![]() |
![]() | #1 |
» Join Date: 01 2002
Posts: 777
Downloads: 1 Uploads: 0
Reputation: 0 | 0 | ![]()
я тут написал, работает, но наверняка есть алгоритм лучше, может кто знает ? void Fill(int array[MAX_X][MAX_Y],int x,int y,int color)<BR>{<BR>if(x<0||y<0||x>MAX_X||y>MAX_Y) return;<BR>if(array[x][y]==color) return; array[x][y]=c; Fill(array,x+1,y,c);<BR>Fill(array,x-1,y,c);<BR>Fill(array,x,y+1,c);<BR>Fill(array,x,y-1,c);<BR>}
__________________ •·•· ·•·· ·· •·•· •·• |
![]() |
![]() | #2 |
Moderator Join Date: 09 2001 Location: South Korea, Gumi
Posts: 7,699
Blog Entries: 16 Downloads: 102 Uploads: 34
Reputation: 561 | 6 | ![]() Заливка замкнутой области<BR>Пример показывает один из самых простых и эффективных способов заливки. Использовать его в таком варианте не рекомендую, рисовать на TImage->Canvas довольно медленно, но в качестве примера очень удобно. Процедура последовательно просматривает соседние точки, и если они не залиты, то заливает и добавляет 4 соседние точки в очередь, на рассмотрение. И так пока очередь не кончится. На рисунке черными стрелками показаны точки, которые будут добавлены в очередь для просмотра, а красными, которые не будут добавлены, так как уже залиты. ![]() ![]() ![]() <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> |
![]() |
![]() | #3 |
Дошкольник Join Date: 01 2002 Location: hell
Posts: 124
Downloads: 0 Uploads: 0
Reputation: 0 | 0 | ![]()
2Zomb:<BR>Hey man, ya i ne znal shto ti uje pereshel na<BR>'pure' programming <IMG SRC="wink.gif" border="0"> tak derzhat'.<BR>Nashet algoritma. IMHO algoritm ne effectiven.<BR>Rekursiyu ispol`zovat' v dannom sluchaye ne imeyet smisla. Sovershenno neponyatno zachem vse vremya nujno peredavat' `array`. Vtoroy algoritm v sushnosti to je samoe, no rekursiya ne ispolzuetsya.<BR>Instead, ispolzuetsya ochered'. Oba algoritma<BR>iz sebya predstavlyayut chastniy sluchay algoritma proxozhdeniya 4arnogo dereva. <BR>Algoritm zomba - pryamoy poryadok proxozhdeniya (recursive). Ispol`zovanie ocheredi(stacka) est' ne shto inoye kak implementaciya rekursii na bolee nizkom urovne. Ved' esli vspomnit', pri vizove funkcii vsya infa zapixivaetsya ne kuda to a imenno v stack. <BR>2Acid:<BR> Slushay, ti eto sam napisal? esli net skaji<BR>pojaluysta otkuda u tebya eti doci.
__________________ [x]-=-[ ]-=-[x] |
![]() |
![]() | #5 |
Дошкольник Join Date: 01 2002 Location: hell
Posts: 124
Downloads: 0 Uploads: 0
Reputation: 0 | 0 | ![]()
thanks
|
![]() |
Sponsored Links |