Výsledky 1 až 2 z 2

Téma: C# semienkove vyplnovanie

  1. #1

    Standardní C# semienkove vyplnovanie

    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

  2. #2
    Senior Member Avatar uživatele Anduril
    Založen
    12.10.2002
    Bydliště
    OVA, OL
    Věk
    42
    Příspěvky
    3 474
    Vliv
    322

    Standardní

    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&#40; y1 < 0 &#41; break;
            &#125;
                  y1++;
                  sleft = sright = false;
    
                  // pokracujeme smerem dolu &#40;pricitani y1&#41;
                  while&#40; bmp.GetPixel&#40; curp.X, y1 &#41; == bpix && y1 < bmp.Height &#41; &#123;
                      // nastavime novou barvu aktualnimu bodu
                      bmp.SetPixel&#40; curp.X, y1, col &#41;;
    
                      // zkontrolujeme bod vlevo
                      if&#40; sleft == false && curp.X > 0 && bmp.GetPixel&#40; curp.X-1, y1 &#41; == bpix &#41; &#123;
                          st.Push&#40; new Point&#40; curp.X-1, y1 &#41; &#41;;
                          sleft = true;
                      &#125;
                      else if&#40; sleft == true && curp.X > 0 && bmp.GetPixel&#40; curp.X-1, y1 &#41; != bpix &#41; &#123;
                          sleft = false;
                      &#125;
    
                      // .. bod vpravo
                      if&#40; sright == false && curp.X < bmp.Width - 1 && bmp.GetPixel&#40; curp.X+1, y1 &#41; == bpix &#41; &#123;
                          st.Push&#40; new Point&#40; curp.X+1, y1&#41; &#41;;
                          sright = true;
                      &#125;
                      else if&#40; sright == true && x < bmp.Width - 1 && bmp.GetPixel&#40; curp.X+1, y1 &#41; != bpix &#41; &#123;
                          sright = false;
                      &#125;
    
                      // posunuti o radek nize
                      y1++;
                      if&#40; y1 >= bmp.Height &#41; break;
                  &#125;
        &#125;
    
        // zrusit zasobnik
        st.Clear&#40;&#41;;
        st = null;
    &#125;
    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

Informace o tématu

Users Browsing this Thread

Toto téma si právě prohlíží 1 uživatelů. (0 registrovaných a 1 anonymních)

Pravidla přispívání

  • Nemůžete zakládat nová témata
  • Nemůžete zasílat odpovědi
  • Nemůžete přikládat přílohy
  • Nemůžete upravovat své příspěvky
  •