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:30.4.2019 21:05

Ahoj, při snaze naprogramovat program, ve kterém je mj. potřeba, aby se v bitmapu pohybovaly pixely. Snažím se to udělat tak, že pro každý bod bitmapu plocha o straně st ověřím, jestli je jeho barva stejná, jako barva b1. Pokud ano a bod zároveň není na okrajích bitmapu, vygeneruju číslo 1-4, které určí směr pohybu. místo, na kterém daný bod byl změní barvu na colorDialog1.Co­lor a bod v daném směru změní barvu na barvu b1. Po několika zkouškách jsem zjistil, že problém je asi v tom ověření if ( plocha.GetPixel(x,y)­.ToArgb() == b1.ToArgb()) ale nemůžu přijít na to, v čem. zde je celý zdrojový kód:

private void pohyb()
        {
            Random rnd = new Random();
            for (int y = 1; y < st; y++)
            {
                for (int x = 1; x < st; x++)
                {

                    if ( plocha.GetPixel(x,y).ToArgb() == b1.ToArgb())
                    {
                        if (y == 1 || y == st || x == 1 || x == st) { plocha.SetPixel(x, y, colorDialog1.Color); }
                        else
                        {
                            plocha.SetPixel(x, y, colorDialog1.Color);
                            int s = rnd.Next(1, 5);
                            if (s == 1) { plocha.SetPixel(x++, y, b1); }
                            if (s == 2) { plocha.SetPixel(x--, y, b1); }
                            if (s == 3) { plocha.SetPixel(x, y++, b1); }
                            if (s == 4) { plocha.SetPixel(x, y--, b1); }
                        }

                    }

                }
            }
        }

Díky

 
Odpovědět
30.4.2019 21:05
Avatar
JerryM
Člen
Avatar
JerryM:1.5.2019 7:33

vubec nechápu co děláš, a to ti nevadí že se ti některý pixely překrejvaj ? a nebylo by lepší aby sis udělat seznam pixelu a uložil ho do List<pixel> ?

 
Nahoru Odpovědět
1.5.2019 7:33
Avatar
Odpovídá na JerryM
Jakub Smetana:1.5.2019 16:15

Já jsem nakonec radši udělal array hodnot, který se potom překreslí do bitmapu. problém je v tom, že ten pohyb stále nefunguje.

private void pohyb()
        {
            Random rnd = new Random();
            for (int y = 1; y < st; y++)
            {
                for (int x = 1; x < st; x++)
                {

                    if ( pole[x,y]==1)
                    {
                        if (y == 1 || y == st || x == 1 || x == st) { pole[x, y] = 0; }
                        else
                        {
                            pole[x, y] = 0;
                            int s = rnd.Next(1, 5);
                            if (s == 1) { pole[x++, y] = 1; }
                            if (s == 2) { pole[x--, y] = 1; }
                            if (s == 3) { pole[x, y++] = 1; }
                            if (s == 4) { pole[x, y--] = 1; }
                        }

                    }

                }
            }
        }
 
Nahoru Odpovědět
1.5.2019 16:15
Avatar
JerryM
Člen
Avatar
JerryM:1.5.2019 16:18

já uplně nechápu co chceš .. to se jako pixely pohybujou po obrazovce a když narazí na okraj tak se od něj odrazí pod uhlem 90 stupnu ?

 
Nahoru Odpovědět
1.5.2019 16:18
Avatar
JerryM
Člen
Avatar
JerryM:1.5.2019 16:20

a nebudeš na to spíš potřebovat ten List záznamů, kde každej záznam si pamatuje vektor směru pohybu a barvu a pozici ???

 
Nahoru Odpovědět
1.5.2019 16:20
Avatar
Jakub Smetana:1.5.2019 16:31

Já prostě potřebuju to, aby pixely, které se náhodně vygenerují na obrazovce, se při každém spuštění tohoto voidu pohnuly o jeden pixel dál, je jedno v jakém směru. když se dostanou na okraj, tak zmizí.

 
Nahoru Odpovědět
1.5.2019 16:31
Avatar
Jakub Smetana:1.5.2019 16:34

Problém je v tom že ony se nikdy nepohnou, a já nevím v čem je problém. Po několika testech jsem zjistil že problém dělala ta podmínka

if ( plocha.GetPixel(x,y).ToArgb() == b1.ToArgb())

tak jsem to zkusil převést do pole s touto podmínkou

if ( pole[x,y]==1)

ale pořád se nepohybují

 
Nahoru Odpovědět
1.5.2019 16:34
Avatar
JerryM
Člen
Avatar
JerryM:1.5.2019 16:44

no moc ti to nejde no... jestli se ty pixely pohybujou náhodně tak není dáno jestli vubec někdy zmizí z obrazovky a je také možné že ti z obrazovky takhle zmizí všechny pixely a obrazovka bude prázdná. měl by sis udělat ten List záznamů tedy List<pixel_item> kde pixel_item je class co má v sobě public proměnný x,y,color když teda opradu náhodně a při každým cyklu smažeš obrazovku a zakreslíš pixely na novou pozici vůči té staré v záznamu pixel_item...takhle bych to udělal já.. a změna směru by asi měla být v 8-mi okolí aby to fungovalo jak má ..

1 2 3
4 X 5
6 7 8

a generuješ náhodným číslem 1..8 nový směr pixelu pro všechny pixely a ty pak vykreslíš najednou na čistou a smazanou obrazovku

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
1.5.2019 16:44
Avatar
Odpovídá na JerryM
Jakub Smetana:1.5.2019 17:32

Tak jsem to udělal podle tebe a už to funguje. Díky

 
Nahoru Odpovědět
1.5.2019 17:32
Avatar
JerryM
Člen
Avatar
JerryM:1.5.2019 17:37

bomba .... ale stejně mám pocit že ti časem všechny pixely zmizí z obrazovky takže by sis tam měl dát nějakej IF a když sou mimo vrátit je na náhodný místo na obrazovce

 
Nahoru Odpovědět
1.5.2019 17:37
Avatar
Odpovídá na JerryM
Jakub Smetana:2.5.2019 7:53

Já jsem to nakonec upravil tak, aby se od těch okrajů odrážely

 
Nahoru Odpovědět
2.5.2019 7:53
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 11 zpráv z 11.