Beispiel #1
0
        public PathFinder(byte[,] grid, PathFinderOptions pathFinderOptions = null)
        {
            if (grid == null)
            {
                throw new Exception("Grid cannot be null");
            }

            _grid = grid;

            if (_mCalcGrid == null || _mCalcGrid.GetLength(0) != _grid.GetLength(0) || _mCalcGrid.GetLength(1) != _grid.GetLength(1))
            {
                _mCalcGrid = new PathFinderNodeFast[_gridX, _gridY];
            }

            _open = new PriorityQueueB <Point>(new ComparePfNodeMatrix(_mCalcGrid));

            _options = pathFinderOptions ?? new PathFinderOptions();

            _direction = _options.Diagonals
                    ? new sbyte[, ] {
                { 0, -1 }, { 1, 0 }, { 0, 1 }, { -1, 0 }, { 1, -1 }, { 1, 1 }, { -1, 1 }, { -1, -1 }
            }
                    : new sbyte[, ] {
                { 0, -1 }, { 1, 0 }, { 0, 1 }, { -1, 0 }
            };
        }
Beispiel #2
0
        public PathFinder(byte[,] grid, PathFinderOptions pathFinderOptions = null)
        {
            if (grid == null)
            {
                throw new Exception("Grid cannot be null");
            }

            _grid  = grid;
            _gridX = (ushort)(_grid.GetUpperBound(0) + 1);
            _gridY = (ushort)(_grid.GetUpperBound(1) + 1);

            // ReSharper disable CompareOfFloatsByEqualityOperator
            if (Math.Log(_gridX, 2) != (int)Math.Log(_gridX, 2) || Math.Log(_gridY, 2) != (int)Math.Log(_gridY, 2))
            {
                throw new Exception("Invalid Grid, size in X and Y must be power of 2");
            }
            // ReSharper restore CompareOfFloatsByEqualityOperator

            _gridXMinus1 = (ushort)(_gridX - 1);
            _gridYLog2   = (ushort)Math.Log(_gridY, 2);

            if (_mCalcGrid == null || _mCalcGrid.Length != (_gridX * _gridY))
            {
                _mCalcGrid = new PathFinderNodeFast[_gridX * _gridY];
            }

            _open = new PriorityQueueB <int>(new ComparePfNodeMatrix(_mCalcGrid));



            //set options
            if (pathFinderOptions == null)
            {
                pathFinderOptions = new PathFinderOptions();
            }

            _formula               = pathFinderOptions.Formula;
            _heavyDiagonals        = pathFinderOptions.HeavyDiagonals;
            _heuristicEstimate     = pathFinderOptions.HeuristicEstimate;
            _punishChangeDirection = pathFinderOptions.PunishChangeDirection;
            _tieBreaker            = pathFinderOptions.TieBreaker;
            _searchLimit           = pathFinderOptions.SearchLimit;
            _diagonals             = pathFinderOptions.Diagonals;
            _direction             = pathFinderOptions.Diagonals
                    ? new sbyte[, ] {
                { 0, -1 }, { 1, 0 }, { 0, 1 }, { -1, 0 }, { 1, -1 }, { 1, 1 }, { -1, 1 }, { -1, -1 }
            }
                    : new sbyte[, ] {
                { 0, -1 }, { 1, 0 }, { 0, 1 }, { -1, 0 }
            };
        }