コード例 #1
0
ファイル: MapHelper.cs プロジェクト: esfdk/OPMGFS
        /// <summary>
        /// Gets the neighbour positions for the given position.
        /// </summary>
        /// <param name="x"> The x-coordinate. </param>
        /// <param name="y"> The y-coordinate. </param>
        /// <param name="map"> The map to get positions for. </param>
        /// <param name="neighbourhood"> The type of neighbourhood to look at. </param>
        /// <returns> A list of the coordinates for the neighbour positions. </returns>
        public static List <Position> GetNeighbourPositions(int x, int y, Enums.HeightLevel[,] map, RuleEnums.Neighbourhood neighbourhood = RuleEnums.Neighbourhood.Moore)
        {
            var list    = new List <Position>();
            var moves   = new[] { -1, 0, 1 };
            var sizeX   = map.GetLength(0);
            var sizeY   = map.GetLength(1);
            var neumann = neighbourhood == RuleEnums.Neighbourhood.VonNeumann ||
                          neighbourhood == RuleEnums.Neighbourhood.VonNeumannExtended;

            if (neighbourhood == RuleEnums.Neighbourhood.MooreExtended ||
                neighbourhood == RuleEnums.Neighbourhood.VonNeumannExtended)
            {
                moves = new[] { -2, -1, 0, 1, 2 }
            }
            ;

            foreach (var moveX in moves)
            {
                foreach (var moveY in moves)
                {
                    if (moveX == 0 && moveY == 0)
                    {
                        continue;
                    }
                    if (neumann && (moveX != 0 && moveY != 0))
                    {
                        continue;
                    }

                    var posToCheck = new Position(x + moveX, y + moveY);
                    if (!WithinMapBounds(posToCheck, sizeX, sizeY))
                    {
                        continue;
                    }
                    list.Add(posToCheck);
                }
            }

            return(list);
        }
コード例 #2
0
ファイル: MapHelper.cs プロジェクト: esfdk/OPMGFS
        /// <summary>
        /// Gets the number of different neighbours surrounding the given position.
        /// </summary>
        /// <param name="x"> The x-coordinate to check neighbours for. </param>
        /// <param name="y"> The y-coordinate to check neighbours for. </param>
        /// <param name="map"> The map. </param>
        /// <param name="neighbourhood"> The type of neighbourhood to look at. </param>
        /// <returns> A dictionary containing the neighbours and the count of them. </returns>
        public static Dictionary <Enums.HeightLevel, int> GetNeighbours(int x, int y, Enums.HeightLevel[,] map, RuleEnums.Neighbourhood neighbourhood = RuleEnums.Neighbourhood.Moore)
        {
            var neighbours = new Dictionary <Enums.HeightLevel, int>();
            var moves      = new[] { -1, 0, 1 };
            var sizeX      = map.GetLength(0);
            var sizeY      = map.GetLength(1);
            var neumann    = neighbourhood == RuleEnums.Neighbourhood.VonNeumann ||
                             neighbourhood == RuleEnums.Neighbourhood.VonNeumannExtended;

            if (neighbourhood == RuleEnums.Neighbourhood.MooreExtended ||
                neighbourhood == RuleEnums.Neighbourhood.VonNeumannExtended)
            {
                moves = new[] { -2, -1, 0, 1, 2 }
            }
            ;

            // Ensure that all keys are in the dictionary
            foreach (var heightlevel in Enum.GetValues(typeof(Enums.HeightLevel)))
            {
                neighbours[(Enums.HeightLevel)heightlevel] = 0;
            }

            foreach (var moveX in moves)
            {
                foreach (var moveY in moves)
                {
                    if (moveX == 0 && moveY == 0)
                    {
                        continue;
                    }
                    if (neumann && (moveX != 0 && moveY != 0))
                    {
                        continue;
                    }

                    var posToCheck = new Position(x + moveX, y + moveY);
                    if (!WithinMapBounds(posToCheck, sizeX, sizeY))
                    {
                        continue;
                    }
                    neighbours[map[posToCheck.Item1, posToCheck.Item2]]++;
                }
            }

            return(neighbours);
        }