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