![[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$.