Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Jakub Smetana:7.1.2019 20:55

Po několika týdnech učení se v c# jsem začal tento projekt. Mým cílem je, aby program nejprve vygeneroval náhodně barvu každého bodu (zelená, nebo modrá). Toto se mi daří. Poté, po kliknutí na tlačítko program zkontroluje pro každý bod (nesousedící s okrajem) počet sousedních zelených bodů. Pokud má okolo sebe 3 nebo více zelených bodů, bude v příští fázi zelený. Pokud méně, bude modrý. tady právě nastává problém, mapa je v následující fázi vždy celá modrá.
Tady je zdrojový kód části, která kontroluje počet okolních zelených pixelů:

for (int y = 1; y < 329; y++)
            {
                for (int x = 1; x < 329; x++)
                {
                    int xp = x + 1;
                    int xm = x - 1;
                    int yp = y + 1;
                    int ym = y - 1;
                    int sousedi = 0;


                    if (mapa.GetPixel(xp, y) == Color.DarkGreen) { sousedi = sousedi+1; }
                    if (mapa.GetPixel(xm, y) == Color.DarkGreen) { sousedi = sousedi+1; }
                    if (mapa.GetPixel(x, yp) == Color.DarkGreen) { sousedi = sousedi+1; }
                    if (mapa.GetPixel(x, ym) == Color.DarkGreen) { sousedi = sousedi+1; }
                    if (mapa.GetPixel(xp, yp) == Color.DarkGreen) { sousedi = sousedi+1; }
                    if (mapa.GetPixel(xm, ym) == Color.DarkGreen) { sousedi = sousedi+1; }
                    if (mapa.GetPixel(xp, ym) == Color.DarkGreen) { sousedi = sousedi+1; }
                    if (mapa.GetPixel(xm, yp) == Color.DarkGreen) { sousedi = sousedi+1; }

                    if (sousedi <= 2)
                    {
                        mapaN.SetPixel(x, y, Color.LightBlue);
                    }

                    if (sousedi >=3)
                    {
                        mapaN.SetPixel(x, y, Color.DarkGreen);
                    }



                }
            }
 
Odpovědět
7.1.2019 20:55
Avatar
HONZ4
Člen
Avatar
Odpovídá na Jakub Smetana
HONZ4:7.1.2019 22:08

Je to logické. s každým nezeleným okolím přidáš další nezelený bod..

if (mapa.GetPixel(xp, y) == Color.DarkGreen) { sousedi = sousedi+1; }
lze zdednodušit na:
if (mapa.GetPixel(xp, y) == Color.DarkGreen) sousedi++; //navýší o 1

vyhodnocení stačí:

if (sousedi < 3) mapaN.SetPixel(x, y, Color.LightBlue);
else
   mapaN.SetPixel(x, y, Color.DarkGreen);
 
Nahoru Odpovědět
7.1.2019 22:08
Avatar
HONZ4
Člen
Avatar
Odpovídá na Jakub Smetana
HONZ4:7.1.2019 23:48

promiň až teď jsem si všiml, že to ukládáš to druhé bitmapy...
No problém bude asi v tom, že ten obrázek neobsahuje barvu Color.DarkGreen, jinak by to fungovalo.

Musíš tu hodit celý kód.

 
Nahoru Odpovědět
7.1.2019 23:48
Avatar
Odpovídá na HONZ4
Jakub Smetana:8.1.2019 7:19

Díky, tady je:

   public partial class Form1 : Form
    {

        Bitmap mapa = new Bitmap(330, 330);
        Bitmap mapaN = new Bitmap(330, 330);


        public Form1()
        {
            InitializeComponent();


        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Random rand = new Random();


            for (int y=0; y<330;y++)
            {
                for (int x = 0; x < 330; x++)
                {
                    int b = rand.Next(1,3);
                    if (b == 1)
                    {
                        mapa.SetPixel(x, y, Color.LightBlue);
                    }
                    if (b == 2)
                    {
                        mapa.SetPixel(x, y, Color.DarkGreen);
                    }

                }
            }
            pictureBox1.Image = mapa;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            for (int y = 0; y < 330; y++)
            {
                int x = 0;
                mapaN.SetPixel(x, y, Color.LightBlue);

            }
            for (int x = 0; x < 330; x++)
            {
                int y = 0;
                mapaN.SetPixel(x, y, Color.LightBlue);

            }
            for (int y = 0; y < 330; y++)
            {
                int x = 329;
                mapaN.SetPixel(x, y, Color.LightBlue);

            }
            for (int x = 0; x < 330; x++)
            {
                int y = 329;
                mapaN.SetPixel(x, y, Color.LightBlue);

            }

            for (int y = 1; y < 329; y++)
            {
                for (int x = 1; x < 329; x++)
                {
                    int xp = x + 1;
                    int xm = x - 1;
                    int yp = y + 1;
                    int ym = y - 1;
                    int sousedi = 0;


                    if (mapa.GetPixel(xp, y) == Color.DarkGreen) { sousedi = sousedi+1; }
                    if (mapa.GetPixel(xm, y) == Color.DarkGreen) { sousedi = sousedi+1; }
                    if (mapa.GetPixel(x, yp) == Color.DarkGreen) { sousedi = sousedi+1; }
                    if (mapa.GetPixel(x, ym) == Color.DarkGreen) { sousedi = sousedi+1; }
                    if (mapa.GetPixel(xp, yp) == Color.DarkGreen) { sousedi = sousedi+1; }
                    if (mapa.GetPixel(xm, ym) == Color.DarkGreen) { sousedi = sousedi+1; }
                    if (mapa.GetPixel(xp, ym) == Color.DarkGreen) { sousedi = sousedi+1; }
                    if (mapa.GetPixel(xm, yp) == Color.DarkGreen) { sousedi = sousedi+1; }

                    if (sousedi <= 2)
                    {
                        mapaN.SetPixel(x, y, Color.LightBlue);
                    }

                    if (sousedi >=3)
                    {
                        mapaN.SetPixel(x, y, Color.DarkGreen);
                    }



                }
            }

            pictureBox1.Image = mapaN;
        }
    }
}
 
Nahoru Odpovědět
8.1.2019 7:19
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:8.1.2019 10:24

Ja bych tam udelal pole a to pole teprve pri zobrazeni prepisoval na bitmapu. Pak je mozne si vypsat pole ciselne, zda je to ok ci ne. Bys vedel, ze selhala zobrazovaci cast.

proc pouzivas x++ ale sousedi+1?

GetPixel vraci barvu v podobe color, to je struktura R, G, B, A, IsKnownColor, IsEmpty, IsNamedColor, IsSystemColor, Name

struktura == struktura je true (nebo false), at uz jsou value jakekoliv.

google = c# color compare

Color.Transparent.ToArgb().Equals(mStartColor.ToArgb())
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
8.1.2019 10:24
Avatar

Člen
Avatar
Odpovídá na Peter Mlich
:8.1.2019 13:33
private bool isSameColor(Color InColor, Color CheckColor) {
     //if (InColor.R == CheckColor.R && InColor.G ==CheckColor.G && InColor.B ==CheckColor.B) { return true; }
     if (InColor.ToArgb() == CheckColor.ToArgb()) { return true; }
     return false;
 }
 
Nahoru Odpovědět
8.1.2019 13:33
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.