Armenian Knowledge Base  

Go Back   Armenian Knowledge Base > Technical sections > Languages, Compilers, Interpreters > Algorithms
Register

Reply
 
LinkBack Thread Tools
Old 22.01.2002, 00:29   #1
»
 
z0mbie's Avatar
 
Join Date: 01 2002
Posts: 777
Downloads: 1
Uploads: 0
Reputation: 0 | 0
Post zalivka [Fill Tool v graph. editor-ax]

я тут написал, работает, но наверняка есть алгоритм лучше, может кто знает ?

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>}
Reply With Quote
Old 22.01.2002, 01:24   #2
Moderator
 
acid's Avatar
 
Join Date: 09 2001
Location: South Korea, Gumi
Posts: 7,699
Downloads: 102
Uploads: 34
Blog Entries: 16
Reputation: 561 | 6
Post

Заливка замкнутой области<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>
Reply With Quote
Old 24.01.2002, 05:08   #3
Дошкольник
 
Dark Abyss of Yerevan's Avatar
 
Join Date: 01 2002
Location: hell
Posts: 124
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Post

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]
Reply With Quote
Old 24.01.2002, 16:39   #4
Moderator
 
acid's Avatar
 
Join Date: 09 2001
Location: South Korea, Gumi
Posts: 7,699
Downloads: 102
Uploads: 34
Blog Entries: 16
Reputation: 561 | 6
Post

2DAY

Ne-a, ja ne pishu na Borland-e.<BR>A istochnik vot zdes':<BR><A HREF="http://www.codenet.ru" TARGET=_blank>Istochnik</A>
Reply With Quote
Old 25.01.2002, 02:14   #5
Дошкольник
 
Dark Abyss of Yerevan's Avatar
 
Join Date: 01 2002
Location: hell
Posts: 124
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Post

thanks
Reply With Quote
Sponsored Links
Reply

Thread Tools


На правах рекламы:
реклама

All times are GMT. The time now is 21:37.


Powered by vBulletin® Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.