Как получить расстояние между 2 точками на изометрической сетке?

Как получить расстояние между двумя точками на изометрической сетке? Я создаю изометрическую игру в facebook (в as3), и когда я перемещаюсь по определенному типу здания, мне нужно знать, входит ли он в диапазон другого типа структуры, например дерева. Я попытался взять сетку x, y точек для обоих элементов и вычислить x, y из этого, но он, похоже, не работает.

5 голосов | спросил Phil 29 J0000006Europe/Moscow 2011, 22:33:08

3 ответа


11

Существует множество способов вычисления расстояний, каждый точечный продукт может быть использован: путь вниз.

В вашем случае вы наверняка хотите вычислить расстояние между центром плиток. Я считаю само собой разумеющимся, что вы знаете, как вычислить центр плитки.

Как только вы знаете позицию, вы можете использовать евклидово расстояние в координатном пространстве холста (т.е. √ [(x'-x ") ² + (y'-y") ²]) или то же самое в координате плитки система.

Другим вариантом является расстояние Манхэттена или такси: d = | x'-x "| + | y ​​'+ y" |; даже в этом случае вы можете использовать координату координаты или холста в области плитки.

Последняя опция (после норм L2 и L1) L "бесконечная" норма, где d - макс между | x'-x "| и | y'-y" |.

Давайте посмотрим на различия:

Лучший способ оценить эти нормы - увидеть форму диска.

Для центра, диск - это каждая точка, которая попадает на фиксированное расстояние (однако вычисляется).

Евклидова норма:

Диск представляет собой стандартный круг в пространстве холста и эллипс в пространстве плитки

L2 canvas

Евклидский холст

L2 tile

Евклидова плитка

В то время как первый из них легче вычислять вообще (вам не нужно идти назад и вперед по плитке и холсту), второй дает лучшую заливку.

«Евклидова плитка» - это норма, которая обычно считается самой правильной. .


Норма такси:

Диск становится алмазом в координате холста и своего рода прямоугольником в координате плитки (показывая, как применение тех же самых изменений координат два раза дает исходный результат)

L1 canvas

Холст для такси

L1 tile

Таксичная плитка

Мы видим даже на этот раз, как координата canvas дает худшие результаты: это цена для более легкого способа вычисления расстояний.

«Таксичная плитка» дает разумные результаты, весьма похожие на «Евклидскую плитку», но просто суммируя координаты плитки. Это очень популярная норма для такого рода проблем.


L0 Norm:

Используя max, если осевые расстояния, диск становится прямоугольником и эквивалентным алмазом в холсте и области плитки соответственно

L0 canvas

Холст L0

L0 tile

L0 Tile

Хорошо, давайте посмотрим правде в глаза: холст L0 ужасен.

С другой стороны, «L0 Tile» имеет смысл: он довольно чистый и very легко вычислить. Можно принимать во внимание при игре с медленным устройством, и нам нужно использовать каждый такт.


Выводы

Нормы, рассчитанные на координатах холста, дают худший результат: две системы координат не очень хорошо подходят, поэтому цена, чтобы иметь более легкую норму, слишком высока.

Евклидова норма - лучший выбор, но более медленный; Норма Taxycab предлагает очень хороший компромисс.

«L0» является самым быстрым и легким, но цена должна быть немного нереалистичной.

ответил FxIII 30 J0000006Europe/Moscow 2011, 23:42:27
4

Я предполагаю, что у вас есть точки (x1, y1) и (x2, y2)

Пифагорейское расстояние между ними sqrt((x1-x2)^2 + (y1-y2)^2). Оставьте sqrt, если вам просто нужно относительное расстояние.

Если вы хотите найти расстояние в элементах плитки сетки, просто разделите:

actual_distance/grid_size

ответил The Communist Duck 29 J0000006Europe/Moscow 2011, 23:47:32
0

Если вам не требуется точное расстояние, но только для проверки того, находится ли ваш объект (x1, y1) в заданном диапазоне от некоторой точки (x2, y2), вам совсем не нужно sqrt. Было бы достаточно проверить следующее:

(x1-x2) ^ 2 + (y1-y2) ^ 2 <= диапазон * диапазон

Это происходит непосредственно из формулы евклидова расстояния и очень дешево вычислять

ответил 32kda 20 FebruaryEurope/MoscowbTue, 20 Feb 2018 13:38:26 +0300000000pmTue, 20 Feb 2018 13:38:26 +030018 2018, 13:38:26

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132