WX-Game1/Assets/MotionFramework/Scripts/Runtime/Engine/Engine.AI/AStar/AStarHeuristic.cs

63 lines
1.6 KiB
C#

//--------------------------------------------------
// Motion Framework
// Copyright©2019-2020 何冠峰
// Licensed under the MIT license
//--------------------------------------------------
using UnityEngine;
namespace MotionFramework.AI
{
/// <summary>
/// 启发式方法
/// </summary>
public static class AStarHeuristic
{
private static readonly float Sqrt2 = Mathf.Sqrt(2f);
/// <summary>
/// 曼哈顿距离
/// 适合四方向(上下左右)移动
/// </summary>
public static float ManhattanDist(Vector3 a, Vector3 b)
{
return Mathf.Abs(a.x - b.x) + Mathf.Abs(a.y - b.y);
}
/// <summary>
/// 切比雪夫距离
/// 适合八方向(包括斜对角)移动
/// </summary>
public static float ChebyshevDist(Vector3 a, Vector3 b)
{
// Diagonal distance = D * max(dx, dy) + (D2 - D) * min(dx, dy)
// D2 = 1, D = 1 ----> max(dx, dy)
float dx = Mathf.Abs(a.x - b.x);
float dy = Mathf.Abs(a.y - b.y);
return Mathf.Max(dx, dy);
}
/// <summary>
/// Octile距离
/// 适合八方向(包括斜对角)移动
/// </summary>
public static float OctileDist(Vector3 a, Vector3 b)
{
// Diagonal distance = D * max(dx, dy) + (D2 - D) * min(dx, dy)
// D2 = sqrt(2), D = 1 ---> max(dx, dy) + (Sqrt2 - 1) * min(dx, dy)
float dx = Mathf.Abs(a.x - b.x);
float dy = Mathf.Abs(a.y - b.y);
return Mathf.Max(dx, dy) + (Sqrt2 - 1f) * Mathf.Min(dx, dy);
}
/// <summary>
/// 欧式距离
/// 适合任意方向移动
/// </summary>
public static float EuclideanDist(Vector3 a, Vector3 b)
{
return Vector3.Distance(a, b);
}
}
}