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