![]() | |
| |||||||
| Home | Register | Blogs | FAQ | Members List | Calendar | Downloads | Arcade | Mark Forums Read |
| Algorithms The source of algorithms for your project |
![]() |
| | LinkBack | Thread Tools | Display Modes |
| | #1 |
| » | я тут написал, работает, но наверняка есть алгоритм лучше, может кто знает ? 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 |
| Administrator Join Date: Sep 2001 Location: Yerevan, Armenia
Posts: 7,069
Blog Entries: 15 Rep Power: 10 Reputation:
246 | Заливка замкнутой области<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> |
| | |
| | #3 |
| Дошкольник | 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 |
| Дошкольник | thanks
__________________ [x]-=-[ ]-=-[x] |
| | |