Geek tričko zdarma Geek tričko zdarma
Tričko zdarma! Stačí před dobitím bodů použít kód TRIKO15. Více informací zde

Diskuze: Generátor Bitmap mapy

Aktivity (4)
Avatar
Jakub Smetana:7. ledna 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. ledna 20:55
Avatar
HONZ4
Člen
Avatar
Odpovídá na Jakub Smetana
HONZ4:7. ledna 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. ledna 22:08
Avatar
HONZ4
Člen
Avatar
Odpovídá na Jakub Smetana
HONZ4:7. ledna 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. ledna 23:48
Avatar
Odpovídá na HONZ4
Jakub Smetana:8. ledna 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. ledna 7:19
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:8. ledna 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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět 8. ledna 10:24
Avatar

Člen
Avatar
Odpovídá na Peter Mlich
:8. ledna 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. ledna 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.