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 :-)
Printable View
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;
}