Пример #1
0
        public void Start(ref Graphics R_g, int warBrz, int sasiedztwo, int promien)
        {
            /*
             * Von Neuman V
             * Moore V
             * Pentagonalne losowe V
             * Heksagonalne Lewe V
             * Heksagonalne Prawe V
             * Heksagonalne Losowe
             * Z promieniem
             */
            Random       random = new Random();
            MapaSasiadow mapa   = new MapaSasiadow();

            List <List <Cell> > R_grid_kopia = new List <List <Cell> >();

            for (int i = 0; i < x; i++)
            {
                R_grid_kopia.Add(new List <Cell>());
                for (int j = 0; j < y; j++)
                {
                    R_grid_kopia[i].Add(new Cell());
                }
            }

            int  pentagonalne_losowe;
            int  heksagonalne_losowe = 0;
            bool ischanged           = true;

            while (ischanged)
            {
                ischanged = false;

                for (int i = 0; i < x; i++)
                {
                    for (int j = 0; j < y; j++)
                    {
                        R_grid_kopia[i][j].Copy(grid[i][j]);
                    }
                }

                for (int j = 0; j < y; j++)
                {
                    for (int i = 0; i < x; i++)
                    {
                        pentagonalne_losowe = random.Next(0, 4);
                        if (sasiedztwo == 5)
                        {
                            heksagonalne_losowe = random.Next(1, 3);
                        }
                        if (!R_grid_kopia[i][j].Get_state_b())
                        {
                            // z promieniem
                            int X_od = -1, Y_od = -1, X_do = 1, Y_do = 1, srodekX = 0, srodekY = 0;
                            if (sasiedztwo == 6)
                            {
                                srodekX = i * size + 1 + size / 2 + R_grid_kopia[i][j].Get_przesuniecie_x() * size / 4;
                                srodekY = j * size + 1 + size / 2 + R_grid_kopia[i][j].Get_przesuniecie_y() * size / 4;
                                X_od    = -x;
                                X_do    = x;
                                Y_od    = -y;
                                Y_do    = y;
                            }


                            for (int ci = X_od; ci <= X_do; ci++)
                            {
                                for (int cj = Y_od; cj <= Y_do; cj++)
                                {
                                    if (cj == 0 && ci == 0)
                                    {
                                        continue;
                                    }
                                    //Von neuman
                                    else if (sasiedztwo == 0 && (ci == -1 && cj == -1 || ci == 1 && cj == -1 || ci == -1 && cj == 1 || ci == 1 && cj == 1))
                                    {
                                        continue;
                                    }
                                    //Pentagonalne ignorujemy prawe
                                    else if (sasiedztwo == 2 && pentagonalne_losowe == 0 && (ci == 1 && cj == -1 || ci == 1 && cj == 0 || ci == 1 && cj == 1))
                                    {
                                        continue;
                                    }
                                    //Pentagonalne ignorujemy lewe
                                    else if (sasiedztwo == 2 && pentagonalne_losowe == 1 && (ci == -1 && cj == -1 || ci == -1 && cj == 0 || ci == -1 && cj == 1))
                                    {
                                        continue;
                                    }
                                    //Pentagonalne ignorujemy gora
                                    else if (sasiedztwo == 2 && pentagonalne_losowe == 2 && (ci == -1 && cj == -1 || ci == 0 && cj == -1 || ci == 1 && cj == -1))
                                    {
                                        continue;
                                    }
                                    //Pentagonalne ignorujemy dol
                                    else if (sasiedztwo == 2 && pentagonalne_losowe == 3 && (ci == -1 && cj == 1 || ci == 0 && cj == 1 || ci == 1 && cj == 1))
                                    {
                                        continue;
                                    }
                                    //Heksagonalne lewe
                                    else if ((heksagonalne_losowe == 1 || sasiedztwo == 3) && (ci == -1 && cj == -1 || ci == 1 && cj == 1))
                                    {
                                        continue;
                                    }
                                    //Heksagonalne prawe
                                    else if ((heksagonalne_losowe == 2 || sasiedztwo == 4) && (ci == 1 && cj == -1 || ci == -1 && cj == 1))
                                    {
                                        continue;
                                    }
                                    else
                                    {
                                        double pkt_promien     = 0;
                                        double promien_kwadrat = 0;
                                        if (sasiedztwo == 6)
                                        {
                                            pkt_promien     = Math.Pow((srodekX - ((i + ci) * size + 1 + size / 2 + R_grid_kopia[Modulo(i + ci, x)][Modulo(j + cj, y)].Get_przesuniecie_x() * size / 4)), 2.0) + Math.Pow((srodekY - ((j + cj) * size + 1 + size / 2 + R_grid_kopia[Modulo(i + ci, x)][Modulo(j + cj, y)].Get_przesuniecie_y() * size / 4)), 2.0);
                                            promien_kwadrat = Math.Pow(promien, 2.0);
                                        }
                                        switch (warBrz)
                                        {
                                        case 0:     //periodyczne
                                            if (sasiedztwo != 6 && R_grid_kopia[Modulo(i + ci, x)][Modulo(j + cj, y)].Get_state_b())
                                            {
                                                int kolorek = R_grid_kopia[Modulo(i + ci, x)][Modulo(j + cj, y)].Get_kolor_id();
                                                mapa.Add(kolorek);
                                            }
                                            else if (pkt_promien <= promien_kwadrat && R_grid_kopia[Modulo(i + ci, x)][Modulo(j + cj, y)].Get_state_b())
                                            {
                                                int kolorek = R_grid_kopia[Modulo(i + ci, x)][Modulo(j + cj, y)].Get_kolor_id();
                                                mapa.Add(kolorek);
                                            }
                                            break;

                                        case 1:     // pochlaniajace
                                            if (sasiedztwo != 6 && (i + ci < x && i + ci >= 0 && j + cj < y && j + cj >= 0 && R_grid_kopia[i + ci][j + cj].Get_state_b()))
                                            {
                                                mapa.Add((R_grid_kopia[i + ci][j + cj].Get_kolor_id()));
                                            }
                                            else if ((i + ci < x && i + ci >= 0 && j + cj < y && j + cj >= 0) && pkt_promien <= promien_kwadrat && R_grid_kopia[i + ci][j + cj].Get_state_b())
                                            {
                                                mapa.Add((R_grid_kopia[i + ci][j + cj].Get_kolor_id()));
                                            }
                                            break;
                                        }
                                    }
                                }
                            }

                            if (mapa.WhetherAdd())
                            {
                                grid[i][j].Set_state(true);
                                grid[i][j].Set_color(mapa.GetMostFrequentColor());
                                grid[i][j].Draw(R_g, i * size + 1, j * size + 1, size - 1, border);
                                ischanged = true;
                            }

                            /*Pen blackPen = new Pen(Color.Black, 3);
                             * R_g.DrawEllipse(blackPen, (i * size + 1 + size / 2 + grid[i][j].get_przesuniecie_x() * size / 4), (j * size + +1 + size / 2 + grid[i][j].get_przesuniecie_y() * size / 4), 2, 2);*/
                        }
                        mapa.Clear();
                    }
                }
            }
        }
Пример #2
0
        void Rozrost(double timestepbefore, double timestep, int sasiedztwo, int promien, int warBrz)
        {
            MapaSasiadow mapa = new MapaSasiadow();

            int    pentagonalne_losowe;
            int    heksagonalne_losowe;
            int    X_od = -1, Y_od = -1, X_do = 1, Y_do = 1, srodekX = 0, srodekY = 0;
            double dyslok_komorki            = 0;
            List <List <Cell> > R_grid_kopia = new List <List <Cell> >();

            for (int k = 0; k < x; k++)
            {
                R_grid_kopia.Add(new List <Cell>());
                for (int j = 0; j < y; j++)
                {
                    R_grid_kopia[k].Add(new Cell());
                    R_grid_kopia[k][j].Copy(grid[k][j]);
                }
            }

            for (int i = 0; i < x; i++)
            {
                for (int j = 0; j < y; j++)
                {
                    dyslok_komorki      = grid[i][j].Get_dyslokacje();
                    pentagonalne_losowe = random.Next(0, 4);
                    heksagonalne_losowe = 0;
                    if (sasiedztwo == 5)
                    {
                        heksagonalne_losowe = random.Next(1, 3);
                    }

                    // z promieniem
                    X_od = -1; Y_od = -1; X_do = 1; Y_do = 1; srodekX = 0; srodekY = 0;
                    if (sasiedztwo == 6)
                    {
                        srodekX = i * size + 1 + size / 2 + R_grid_kopia[i][j].Get_przesuniecie_x() * size / 4;
                        srodekY = i * size + 1 + size / 2 + R_grid_kopia[i][j].Get_przesuniecie_y() * size / 4;
                        X_od    = -x;
                        X_do    = x;
                        Y_od    = -y;
                        Y_do    = y;
                    }


                    for (int ci = X_od; ci <= X_do; ci++)
                    {
                        for (int cj = Y_od; cj <= Y_do; cj++)
                        {
                            if (cj == 0 && ci == 0)
                            {
                                continue;
                            }
                            //Von neuman
                            else if (sasiedztwo == 0 && (ci == -1 && cj == -1 || ci == 1 && cj == -1 || ci == -1 && cj == 1 || ci == 1 && cj == 1))
                            {
                                continue;
                            }
                            //Pentagonalne ignorujemy prawe
                            else if (sasiedztwo == 2 && pentagonalne_losowe == 0 && (ci == 1 && cj == -1 || ci == 1 && cj == 0 || ci == 1 && cj == 1))
                            {
                                continue;
                            }
                            //Pentagonalne ignorujemy lewe
                            else if (sasiedztwo == 2 && pentagonalne_losowe == 1 && (ci == -1 && cj == -1 || ci == -1 && cj == 0 || ci == -1 && cj == 1))
                            {
                                continue;
                            }
                            //Pentagonalne ignorujemy gora
                            else if (sasiedztwo == 2 && pentagonalne_losowe == 2 && (ci == -1 && cj == -1 || ci == 0 && cj == -1 || ci == 1 && cj == -1))
                            {
                                continue;
                            }
                            //Pentagonalne ignorujemy dol
                            else if (sasiedztwo == 2 && pentagonalne_losowe == 3 && (ci == -1 && cj == 1 || ci == 0 && cj == 1 || ci == 1 && cj == 1))
                            {
                                continue;
                            }
                            //Heksagonalne lewe
                            else if ((heksagonalne_losowe == 1 || sasiedztwo == 3) && (ci == -1 && cj == -1 || ci == 1 && cj == 1))
                            {
                                continue;
                            }
                            //Heksagonalne prawe
                            else if ((heksagonalne_losowe == 2 || sasiedztwo == 4) && (ci == 1 && cj == -1 || ci == -1 && cj == 1))
                            {
                                continue;
                            }
                            else
                            {
                                double pkt_promien     = 0;
                                double promien_kwadrat = 0;
                                if (sasiedztwo == 6)
                                {
                                    pkt_promien     = Math.Pow((srodekX - ((i + ci) * size + 1 + size / 2 + R_grid_kopia[Modulo(i + ci, x)][Modulo(j + cj, y)].Get_przesuniecie_x() * size / 4)), 2.0) + Math.Pow((srodekY - ((j + cj) * size + 1 + size / 2 + R_grid_kopia[Modulo(i + ci, x)][Modulo(j + cj, y)].Get_przesuniecie_y() * size / 4)), 2.0);
                                    promien_kwadrat = Math.Pow(promien, 2.0);
                                }
                                switch (warBrz)
                                {
                                case 0:     //periodyczne
                                    if (sasiedztwo != 6 && R_grid_kopia[Modulo(i + ci, x)][Modulo(j + cj, y)].Get_state_b())
                                    {
                                        mapa.addDyslok(R_grid_kopia[Modulo(i + ci, x)][Modulo(j + cj, y)].Get_dyslokacje(), dyslok_komorki);
                                        if (R_grid_kopia[Modulo(i + ci, x)][Modulo(j + cj, y)].Get_rekrystalizowany_timestep() == timestepbefore)
                                        {
                                            mapa.Add(R_grid_kopia[Modulo(i + ci, x)][Modulo(j + cj, y)].Get_kolor_id());
                                        }
                                    }
                                    else if (pkt_promien <= promien_kwadrat && R_grid_kopia[Modulo(i + ci, x)][Modulo(j + cj, y)].Get_state_b())
                                    {
                                        mapa.addDyslok(R_grid_kopia[Modulo(i + ci, x)][Modulo(j + cj, y)].Get_dyslokacje(), dyslok_komorki);
                                        if (R_grid_kopia[Modulo(i + ci, x)][Modulo(j + cj, y)].Get_rekrystalizowany_timestep() == timestepbefore)
                                        {
                                            mapa.Add(R_grid_kopia[Modulo(i + ci, x)][Modulo(j + cj, y)].Get_kolor_id());
                                        }
                                    }
                                    break;

                                case 1:     // pochlaniajace
                                    if (sasiedztwo != 6 && (i + ci < x && i + ci >= 0 && j + cj < y && j + cj >= 0 && R_grid_kopia[i + ci][j + cj].Get_state_b()))
                                    {
                                        mapa.addDyslok(R_grid_kopia[i + ci][j + cj].Get_dyslokacje(), dyslok_komorki);
                                        if (R_grid_kopia[i + ci][j + cj].Get_rekrystalizowany_timestep() == timestepbefore)
                                        {
                                            mapa.Add(R_grid_kopia[Modulo(i + ci, x)][Modulo(j + cj, y)].Get_kolor_id());
                                        }
                                    }
                                    else if ((i + ci < x && i + ci >= 0 && j + cj < y && j + cj >= 0) && pkt_promien <= promien_kwadrat && R_grid_kopia[i + ci][j + cj].Get_state_b())
                                    {
                                        mapa.addDyslok(R_grid_kopia[i + ci][j + cj].Get_dyslokacje(), dyslok_komorki);
                                        if (R_grid_kopia[i + ci][j + cj].Get_rekrystalizowany_timestep() == timestepbefore)
                                        {
                                            mapa.Add(R_grid_kopia[Modulo(i + ci, x)][Modulo(j + cj, y)].Get_kolor_id());
                                        }
                                    }
                                    break;
                                }
                            }
                        }
                    }
                    if (mapa.WhetherAdd() && mapa.WhetherDyslok())
                    {
                        grid[i][j].Zarodkuj(mapa.GetMostFrequentColor(), timestepbefore + timestep);
                    }

                    mapa.Clear();
                }
            }
        }