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); }
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; } }
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; } }
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; }