HPASharp.ConcreteMap.GetHeuristic C# (CSharp) Method

GetHeuristic() public method

public GetHeuristic ( int startNodeId, int targetNodeId ) : int
startNodeId int
targetNodeId int
return int
        public int GetHeuristic(int startNodeId, int targetNodeId)
        {
            var startPos = Graph.GetNodeInfo(startNodeId).Position;
            var targetPos = Graph.GetNodeInfo(targetNodeId).Position;

            var startX = startPos.X;
            var targetX = targetPos.X;
            var startY = startPos.Y;
            var targetY = targetPos.Y;
            var diffX = Math.Abs(targetX - startX);
            var diffY = Math.Abs(targetY - startY);
            switch (TileType)
            {
                case TileType.HEX:
                    // Vancouver distance
                    // See P.Yap: Grid-based Path-Finding (LNAI 2338 pp.44-55)
                    {
                        var correction = 0;
                        if (diffX % 2 != 0)
                        {
                            if (targetY < startY)
                                correction = targetX % 2;
                            else if (targetY > startY)
                                correction = startX % 2;
                        }

                        // Note: formula in paper is wrong, corrected below.  
                        var dist = Math.Max(0, diffY - diffX / 2 - correction) + diffX;
                        return dist * 1;
                    }
                case TileType.OCTILE_UNICOST:
                    return Math.Max(diffX, diffY) * Constants.COST_ONE;
                case TileType.OCTILE:
                    int maxDiff;
                    int minDiff;
                    if (diffX > diffY)
                    {
                        maxDiff = diffX;
                        minDiff = diffY;
                    }
                    else
                    {
                        maxDiff = diffY;
                        minDiff = diffX;
                    }

                    return (minDiff * Constants.COST_ONE * 34) / 24 + (maxDiff - minDiff) * Constants.COST_ONE;

                case TileType.TILE:
                    return (diffX + diffY) * Constants.COST_ONE;
                default:
                    return 0;
            }
        }