Java týden Java týden
Pouze tento týden sleva až 80 % na celý Java e-learning!
Brno? Vypsali jsme pro vás nové termíny školení OOP v Brně!
Avatar
Jakub Smetana:30. dubna 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. dubna 21:05
Avatar
JerryM
Člen
Avatar
JerryM:1. května 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. května 7:33
Avatar
Odpovídá na JerryM
Jakub Smetana:1. května 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. května 16:15
Avatar
JerryM
Člen
Avatar
JerryM:1. května 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 1. května 16:18
Avatar
JerryM
Člen
Avatar
JerryM:1. května 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. května 16:20
Avatar
Jakub Smetana:1. května 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. května 16:31
Avatar
Jakub Smetana:1. května 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. května 16:34
Avatar
JerryM
Člen
Avatar
JerryM:1. května 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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět 1. května 16:44
Avatar
Odpovídá na JerryM
Jakub Smetana:1. května 17:32

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

 
Nahoru Odpovědět 1. května 17:32
Avatar
JerryM
Člen
Avatar
JerryM:1. května 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. května 17:37
Avatar
Odpovídá na JerryM
Jakub Smetana:2. května 7:53

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

 
Nahoru Odpovědět 2. května 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.