Beispiel #1
0
        private Point NextPos(Paricle p)
        {
            var v = new Point(p.X, p.Y);

            var oldV = new Point(p.X, p.Y);

            if (p.Go(rand))
            {
                if (task == 2 && p.type == 1)
                {
                    if (rand.NextDouble() >= 0.75)     //смещение по Y с вероятностью 25%
                    {
                        v.Y = v.Y + Convert.ToInt32(Math.Pow(-1, rand.Next(1, 3)));
                    }
                }
                if (feelWall(v))
                {
                    v.Y = oldV.Y;
                }
                v.X += 1;
            }
            if (feelEnd(v))
            {
                v.X = 0;
            }

            if (oldV.X < kX / 2 && v.X >= kX / 2 && v.Y != 0 && v.Y != kY)
            {
                counter[v.Y - 1]++;
            }

            return(v);
        }
Beispiel #2
0
        int task = -1;              //0 - однотипные частицы; 1 - смешанные частицы; 2 - смешанные с обгоном; -1 - ошибка;

        public Field(int _w, int _h, int _g, int _amnt, int _task)
        {
            grid_step = _g;
            kX        = _w / _g;
            kY        = _h / _g;
            amnt      = _amnt;
            ticker    = 0;
            Paricle   = new List <Paricle>();
            wall      = new int[kX, kY];
            intens    = new float[kY - 2];
            counter   = new int[kY - 2];
            task      = _task;
            float per;

            if (task == 0)
            {
                per = 0.3f;
            }
            else
            {
                per = 2;
            }

            for (int i = 0; i < kY - 2; i++)
            {
                counter[i] = 0;
            }

            for (int i = 0; i < kY - 2; i++)
            {
                intens[i] = 0;
            }

            for (var i = 0; i < amnt; ++i)
            {
                Paricle part;
                bool    f;
                do
                {
                    part = new Paricle(kY, per);

                    f = Paricle.Any(p => p.X == part.X && p.Y == part.Y);
                } while (f);
                Paricle.Add(part);
            }

            //создание стен
            for (var i = 0; i < kX; i++)
            {
                wall[i, 0]      = 1;
                wall[i, kY - 1] = 1;
            }
        }
Beispiel #3
0
        int[,] wall; //границы стен;

        #endregion Fields

        #region Constructors

        public Field(int _w, int _h, int _g, int _amnt, int _task)
        {
            grid_step = _g;
            kX = _w / _g;
            kY = _h / _g;
            amnt = _amnt;
            ticker = 0;
            Paricle = new List<Paricle>();
            wall = new int[kX, kY];
            intens = new float[kY-2];
            counter = new int[kY-2];
            task = _task;
            float per;
            if (task == 0)
                per = 0.3f;
            else
                per = 2;

            for(int i = 0; i < kY-2; i++)
                counter[i] = 0;

            for (int i = 0; i < kY-2; i++)
                intens[i] = 0;

            for (var i = 0; i < amnt; ++i)
            {
                Paricle part;
                bool f;
                do
                {
                    part = new Paricle(kY,per);

                    f = Paricle.Any(p => p.X == part.X && p.Y == part.Y);
                } while (f);
                Paricle.Add(part);
            }

            //создание стен
            for (var i = 0; i < kX; i++)
            {
                wall[i, 0] = 1;
                wall[i, kY - 1] = 1;
            }
        }
Beispiel #4
0
        private Point NextPos(Paricle p)
        {
            var v = new Point(p.X, p.Y);

            var oldV = new Point(p.X, p.Y);
            if (p.Go(rand))
            {
                if (task == 2 && p.type == 1)
                {
                    if(rand.NextDouble() >= 0.75)     //смещение по Y с вероятностью 25%
                        v.Y = v.Y + Convert.ToInt32(Math.Pow(-1, rand.Next(1, 3)));
                }
                if (feelWall(v))
                    v.Y = oldV.Y;
                v.X += 1;
            }
            if (feelEnd(v))
                v.X = 0;

            if (oldV.X < kX/2 && v.X >= kX / 2 && v.Y != 0 && v.Y != kY)
                counter[v.Y-1]++;

            return v;
        }