private Tuple<int, PopulationCell>[] PopulateDepartment(DepartmentInfo depInfo, out Human[] humanArray) { List<Human> humanList = new List<Human>(depInfo.GetTotal()); int areaSize = depInfo.Coordinates.Length; // number of points to be populated. Tuple<int, PopulationCell>[] resultArray = // the array which will be returned. new Tuple<int,PopulationCell>[areaSize]; int resultArrayIndex = 0; // running index for the array. Point origin = CalculateInitialPoint(depInfo.Coordinates); // the origin as an fixpoint for every point. int maximumDistance = depInfo.Coordinates.Max( // the maximum distance possible. point => point.Distance(origin)) + 1; int[] factors = new int[maximumDistance]; // array of factor for each distance. factors[0] = 225; // start factor. for (int i = 1; i < maximumDistance; i++) // creating every factor for each distance. { int previousFactor = factors[i - 1]; int minus = (int)(previousFactor / 3f / 6); int random = RANDOM.Next(previousFactor / 3) - minus; random = (int)(random * (1 - i / (float)maximumDistance)); if (previousFactor - random <= 0) random = 5; factors[i] = previousFactor - random; } foreach (Point currentPoint in depInfo.Coordinates) { int currentDistance = currentPoint.Distance(origin); // distance of this point to the origin. PopulationCell currentCell = new PopulationCell(); for (int i = 0; i < 8; i++) // for each age-group. { int additionalRand = RANDOM.Next(10) - 5; int numberForEvenSpread = // number of humans if everything would be even/the same. (int)(depInfo.Population[i] / (float)areaSize); int numberOfPeopleToSet = // number of humans to be set for this age-group. (int)(numberForEvenSpread * (factors[currentDistance] + additionalRand) / 100f); EGender gender = (i < 4) ? // the first four are male, the last female. EGender.Male : EGender.Female; var bounds = GetAgeBounds(i); // the age-boundaries for the corresponding age-group. int lowerAgeBound = bounds.Item1; int upperAgeBound = bounds.Item2; for (int setCount = 0; setCount < numberOfPeopleToSet; setCount++) { int thisAge = RANDOM.Next(lowerAgeBound, upperAgeBound + 1); Human thisHuman = Human.Create(gender, thisAge, currentPoint.Flatten(WIDTH)); humanList.Add(thisHuman); currentCell.Data[i]++; // 'adds' the human to its cell. depInfo.Population[i]--; // 'removes' the human out of the population. } } areaSize--; // 'removes' point from rest-area. resultArray[resultArrayIndex++] = new Tuple<int, PopulationCell>( currentPoint.Flatten(WIDTH), currentCell); } humanArray = humanList.ToArray(); humanList = null; return resultArray; }
/// <summary> /// The Dummy-implementation. /// </summary> private Tuple<int, PopulationCell>[] DummyPopulate(DepartmentInfo depInfo, out Human[] humanArray) { int areaSize = depInfo.Coordinates.Length; Tuple<int, PopulationCell>[] tmpArray = new Tuple<int, PopulationCell>[areaSize]; int tmpCounter = 0; humanArray = new Human[depInfo.GetTotal()]; int humanCounter = 0; int[] popsPerPoint = depInfo.Population.Select(x => x / areaSize).ToArray(); foreach (Point point in depInfo.Coordinates) { PopulationCell cell = new PopulationCell(); for (int i = 0; i < 8; i++) { EGender gender = (i < 4) ? EGender.Male : EGender.Female; var bounds = GetAgeBounds(i); int lowerAgeBound = bounds.Item1; int upperAgeBound = bounds.Item2; for (int n = 0; n < popsPerPoint[i]; n++) { int thisAge = RANDOM.Next(lowerAgeBound, upperAgeBound + 1); humanArray[humanCounter++] = Human.Create(gender, thisAge, point.Flatten(WIDTH)); cell.Data[i]++; } } tmpArray[tmpCounter++] = new Tuple<int, PopulationCell>(point.Flatten(WIDTH), cell); } return tmpArray; }