public int GetHeuristic(int startNodeId, int targetNodeId)
{
var startPos = AbstractGraph.GetNodeInfo(startNodeId).Position;
var targetPos = AbstractGraph.GetNodeInfo(targetNodeId).Position;
var diffY = Math.Abs(startPos.Y - targetPos.Y);
var diffX = Math.Abs(startPos.X - targetPos.X);
switch (Type)
{
case AbsType.ABSTRACT_TILE:
// Manhattan distance
return (diffY + diffX) * Constants.COST_ONE;
case AbsType.ABSTRACT_OCTILE:
// Diagonal distance
{
var diag = Math.Min(diffX, diffY);
var straight = diffX + diffY;
// According to the information link, this is the shape of the function.
// We just extract factors to simplify.
// Possible simplification: var h = Constants.CellCost * (straight + (Constants.Sqrt2 - 2) * diag);
return Constants.COST_ONE * straight + (Constants.COST_ONE * 34 / 24 - 2 * Constants.COST_ONE) * diag;
}
default:
return 0;
}
}