![[image5_11zon_7723f44a19.png]] Полезная ссылка по данной теме: - [[Как измерить расстояние между двумя точками в пространстве]] Манхэттенская дистанция — это метрика, используемая для измерения расстояния между двумя точками, при котором учитывается только "вертикальное" и "горизонтальное" перемещение. Иными словами, это как бы расстояние, которое вы пройдёте, двигаясь только вверх-вниз или влево-вправо, как будто перемещаетесь по улицам города, расположенных перпендикулярно друг другу. Название "Манхэттенская" происходит от сетки улиц Манхэттена, одного из районов Нью-Йорка. Улицы Манхэттена образуют сетку, и чтобы доехать из одной точки в другую, можно двигаться только вертикально вверх-вниз или горизонтально влево-вправо по этой сетке. В этом контексте дистанция между двумя точками не измеряется как прямая линия (как в случае евклидовой дистанции), а как сумма вертикального и горизонтального расстояний между ними. Этот метод измерения расстояний является аналогом манхэттенской дистанции в математическом смысле. ### Когда лучше использовать манхэттенскую дистанцию Манхэттенская дистанция быстрее в расчетах чем: - [[Евклидова Дистанция (Euclidean Distance)]] - [[Квадрат Евклидовой Дистанции (Squared Euclidean Distance)]] поскольку она использует только сложение и абсолютное значение. Однако она и наименее точная. Примеры использования: - Сеточные Пространства: Если движение возможно только вдоль сетки (как в некоторых типах компьютерных игр, включая некоторые RTS), Манхэттенская дистанция может быть более точной мерой расстояния, чем евклидова. - Ограниченные Повороты или Действия: Если агент (например, юнит в вашей игре) может двигаться только в ортогональных направлениях (вверх, вниз, влево, вправо), манхэттенская дистанция является адекватной мерой. - Поиск Пути: В алгоритмах поиска пути, таких как A*, манхэттенская дистанция может использоваться как эвристика. ### Как считать в 2D-пространстве Формула для двухмерного пространства: $ \text{Манхэттенская дистанция} = |x_2 - x_1| + |y_2 - y_1| $ Пример: - Пусть есть две точки A(1, 2) и B(4, 6). - Манхэттенская дистанция между ними: \(|4 - 1| + |6 - 2| = 3 + 4 = 7\) ##### Пример в C\# ```csharp using System; public class Program { public static int ManhattanDistance(int x1, int y1, int x2, int y2) { return Math.Abs(x2 - x1) + Math.Abs(y2 - y1); } public static void Main() { int distance = ManhattanDistance(1, 2, 4, 6); Console.WriteLine(quot;Manhattan Distance: {distance}"); } } ``` ##### Пример в Unity ```csharp using UnityEngine; public class ManhattanDistanceExample : MonoBehaviour { public Vector2 pointA; public Vector2 pointB; void Start() { float distance = ManhattanDistance(pointA, pointB); Debug.Log(quot;Manhattan Distance: {distance}"); } float ManhattanDistance(Vector2 a, Vector2 b) { return Mathf.Abs(b.x - a.x) + Mathf.Abs(b.y - a.y); } } ``` Оба этих метода эффективны по производительности: они используют только базовые арифметические операции. Однако, учтите, что `Mathf.Abs` и `Math.Abs` в C# и Unity отличаются друг от друга. `Mathf.Abs` оптимизирован для игровых приложений и работает быстрее, что может быть важно в вашем случае, когда требуется высокая производительность для большого количества сущностей, компонентов и систем. ### Как считать в 3D-пространстве Точно так же, как в 2D-пространстве, только в формулу добавляется координата $Z$.