Ahojte neviete niekto existuje v C# metoda ktora sa stara o vyplnovanie uzavretych ploch ? Potrebujem to na zadanie 2D editora a cloveku by dost pomohlo ak by taka metoda uz existovala .. dik![]()
Ahojte neviete niekto existuje v C# metoda ktora sa stara o vyplnovanie uzavretych ploch ? Potrebujem to na zadanie 2D editora a cloveku by dost pomohlo ak by taka metoda uz existovala .. dik![]()
Myslim, ze neni... jsou pouze fce pro vyplnovani zadanych ohranicenych oblasti..
Cesta je pres api fce (ExtFloodFill) a nebo udelat fci, ktera to pres Bitmap objekt a fce Set/GetPixel provede...
tady mas scanline floodfill algoritmus..
bmp je bitmapa, na kterou se bude kresli, x,y jsou souradnice seminka, col je barva vyplne.
Kód:... using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Collections; ... ... void FloodFillScanLine(ref Bitmap bmp, int x, int y, Color col) { // zjistime barvu pixelu v zadanem bode Color bpix = bmp.GetPixel( x, y ); Color newpix = Color.FromArgb( col.R, col.G, col.B ); // pokud se barva rovna barve vyplne, skoncime if( newpix == bpix ) { return; } // vytvorime zasobnik Stack st = new Stack(); int y1; // y-ova uroven bool sleft, sright; // urcuji, zda byla zkontrolovana leva/prava strana od bodu // vypln.. st.Push( new Point(x ,y) ); Point curp; while( true ) { // vybrani dalsiho bodu ze zasobniku try { Object obj = st.Pop(); curp = (Point)obj; } catch { break; } // najdeme nejnizsi y-ovou uroven, od ktere budeme vyplnovat y1 = curp.Y; while( bmp.GetPixel( curp.X, y1 ) == bpix && y1 >= 0 ) { y1--; if( y1 < 0 ) break; } y1++; sleft = sright = false; // pokracujeme smerem dolu (pricitani y1) while( bmp.GetPixel( curp.X, y1 ) == bpix && y1 < bmp.Height ) { // nastavime novou barvu aktualnimu bodu bmp.SetPixel( curp.X, y1, col ); // zkontrolujeme bod vlevo if( sleft == false && curp.X > 0 && bmp.GetPixel( curp.X-1, y1 ) == bpix ) { st.Push( new Point( curp.X-1, y1 ) ); sleft = true; } else if( sleft == true && curp.X > 0 && bmp.GetPixel( curp.X-1, y1 ) != bpix ) { sleft = false; } // .. bod vpravo if( sright == false && curp.X < bmp.Width - 1 && bmp.GetPixel( curp.X+1, y1 ) == bpix ) { st.Push( new Point( curp.X+1, y1) ); sright = true; } else if( sright == true && x < bmp.Width - 1 && bmp.GetPixel( curp.X+1, y1 ) != bpix ) { sright = false; } // posunuti o radek nize y1++; if( y1 >= bmp.Height ) break; } } // zrusit zasobnik st.Clear(); st = null; }
ntb: HP EliteBook 8460p i7-2640M | 8GB RAM | 120GB SSD + 500GB HDD | ATi HD6470 | 14" HD+ | W7 PRO
home: HP Docking Station | HP L2045W | WD 500GB Scorpio Blue USB box
work: HP Docking Station | HP L2445W
audio: Epiphone G-400 SG + Sounder Telecaster | E-MU 0202 | Cambridge Audio Azur 340R | Wharfedale Diamond 9.2 | Magnat Betasub 20A | Sennheiser HD555
Toto téma si právě prohlíží 1 uživatelů. (0 registrovaných a 1 anonymních)