Я использую проверки расстояния в квадрате для практически всех моих проверок расстояния (длины вектора 3) из-за увеличения производительности в результате отсутствия квадратного корня (как при проверке простой длины).
Судя по всему, квадратные дистанционные проверки отлично работают в любой ситуации:
if x^2 < y^2, then x < y, even when 0 < (x or y) < 1
Я не рассматриваю ситуации, когда x или y меньше 0, так как расстояние и квадрат расстояния всегда будут положительными.
Поскольку это работает, похоже, что дистанционные проверки никогда не нужны, но у меня есть ноющее чувство, что я что-то упускаю. Будет ли это сохраняться в критических ситуациях?
источник
d^2
ужасно. В А *|dx| + |dy|
работает красиво. У меня нет ссылки, так как я читаю месяц или около того назад.Как намекал bummzack на аналогию с поиском пути, вам НУЖНО использовать «нормальную» длину каждый раз, когда вы складываете расстояния и хотите сравнить их сумму. (Просто потому, что суммы квадратов длин отличаются от квадратов сумм длин).
х ^ 2 + у ^ 2! = (х + у) ^ 2
источник
Единственный недостаток, о котором я могу думать, это когда приходится иметь дело с большими числами, которые будут переполнены в квадрате.
Например, в Java:
Также стоит отметить, что это происходит, когда вы используете Math.pow () с точно такими же числами и приводите обратно к int из двойного числа, возвращаемого из
Math.pow()
:Работает? Нет , он дал только правильный ответ, потому что
y*y
ограниченInteger.MAX_VALUE
, иx*x
меньше, чемInteger.MAX_VALUE
. Если быx*x
также был привязан к,Integer.MAX_VALUE
то вы получите неправильный ответ.Подобные принципы также применимы к плавающим и двойным значениям (за исключением того, что они, очевидно, имеют больший диапазон перед переполнением) и любому другому языку, который позволяет незаметно переполняться.
источник
float
s для координат, которые переполняются только после того, как10^38
нетint
.Однажды я работал на квадратных расстояниях и допустил ошибку, рассчитав квадратные расстояния для счетчика одометров.
Конечно, вы не можете сделать это, потому что математически,
В итоге я получил неверный результат. К сожалению!
источник
sqrt
все равно нужно будет выполнить операцию.У вас могут возникнуть проблемы, если вы пишете алгоритм, который требует, чтобы вы вычислили оптимизированную позицию. Например, допустим, у вас был набор объектов, и вы пытались вычислить позицию с наименьшим общим расстоянием от всех объектов. Просто в качестве конкретного примера, скажем, мы пытаемся питать три здания, и мы хотим выяснить, куда должна идти электростанция, чтобы мы могли подключить ее ко всем зданиям, используя наименьшую общую длину провода. Используя метрику расстояния в квадрате, вы получите координату X электростанции, представляющую собой среднее значение координаты X всех зданий (и аналогично координате Y). Используя обычную метрику расстояния, решение будет отличаться, и часто очень далеко от решения по квадрату расстояния.
источник
x^2
легче работать|x|
.Использование квадрата расстояния почти всегда просто отлично и хорошо для производительности. Важны следующие соображения:
Если вы хотите подумать о сумме нескольких расстояний, квадрат расстояния будет неточным. Например, у меня есть два расстояния, и я хочу убедиться, что их сумма меньше 10. Следующий код неверен:
Он не может быть утвержден в следующем неверном случае:
a=36
иb=49
. В этом случае первая длина равна 6, а вторая 7; их сумма больше 10, но сумма квадратов не больше 100 или больше.Другое соображение: для реальных расстояний квадрат расстояния всегда будет положительным. Например, если вы измеряете смещение, вам, возможно, придется иметь дело с отрицательными значениями, а возведение их в квадрат не поможет.
источник