Utilizo verificaciones de distancia al cuadrado para básicamente todas mis verificaciones de distancia (longitud de vector3), debido al aumento del rendimiento de no incurrir en una raíz cuadrada (como en las verificaciones de longitud simple).
Por lo que parece, los controles de distancia al cuadrado funcionan bien en cada situación:
if x^2 < y^2, then x < y, even when 0 < (x or y) < 1
No estoy considerando situaciones en las que x o y sea menor que 0, ya que la distancia y la distancia al cuadrado siempre serán positivas.
Como esto funciona, parece que nunca se necesitan verificaciones de distancia, pero tengo la sensación de que me falta algo. ¿Se mantendrá esto en situaciones críticas de precisión?
fuente
d^2
funcionaba horrible. En A *|dx| + |dy|
funciona muy bien. No tengo el enlace ya que leí hace un mes más o menos.Como bummzack insinuó con la analogía de encontrar el Camino, NECESITA usar la longitud "normal" cada vez que agrega distancias y desea comparar su suma. (Solo porque las sumas de cuadrados de longitudes son diferentes de las sumas cuadradas de longitudes).
x ^ 2 + y ^ 2! = (x + y) ^ 2
fuente
La única desventaja que se me ocurre es cuando se trata de grandes números que se desbordarán cuando estén al cuadrado.
Por ejemplo, en Java:
También vale la pena señalar que eso es lo que sucede cuando usa Math.pow () con exactamente los mismos números y devuelve a int desde el doble devuelto por
Math.pow()
:¿Está funcionando? No , solo dio la respuesta correcta porque
y*y
está sujeta aInteger.MAX_VALUE
, yx*x
es menor queInteger.MAX_VALUE
. Six*x
también se sujetóInteger.MAX_VALUE
, obtendría una respuesta incorrecta.Principios similares también se aplican con flotadores y dobles (excepto que obviamente tienen un rango mayor antes de que se desborden) y cualquier otro lenguaje que silenciosamente permita desbordamientos.
fuente
float
s para las coordenadas, que solo se desbordan después de10^38
no hacerloint
.Una vez estaba trabajando en distancias cuadradas, y cometí el error de acumular distancias cuadradas, para contar el odómetro.
Por supuesto, no puedes hacer esto, porque matemáticamente,
Entonces, terminé con un resultado incorrecto allí. ¡Uy!
fuente
sqrt
todos modos necesita terminar la operación.Puede tener problemas si está escribiendo un algoritmo que requiere que calcule una posición optimizada. Por ejemplo, supongamos que tenía un conjunto de objetos y estaba tratando de calcular la posición con la distancia total más pequeña de todos los objetos. Solo por un ejemplo concreto, digamos que estamos tratando de alimentar tres edificios, y queremos averiguar a dónde debe ir la planta de energía para que podamos conectarla a todos los edificios utilizando la menor longitud total de cable. Usando la métrica de la distancia al cuadrado, terminarías con la coordenada x de la central eléctrica como el promedio de las coordenadas x de todos los edificios (y de forma análoga a la coordenada y). Usando la métrica de distancia ordinaria, la solución sería diferente y, a menudo, muy alejada de la solución de distancia al cuadrado.
fuente
x^2
es más fácil trabajar con ellos que|x|
.Usar la distancia al cuadrado casi siempre está bien y es bueno para el rendimiento. Las siguientes consideraciones son importantes:
Si desea pensar en la suma de varias distancias, la distancia al cuadrado será inexacta. Por ejemplo, tengo dos distancias y quiero asegurarme de que su suma sea inferior a 10. El siguiente código es incorrecto:
No se puede afirmar en el siguiente caso no válido:
a=36
yb=49
. En este caso, la primera longitud es 6 y la segunda 7; su suma es mayor que 10, pero la suma de los cuadrados no es 100 o mayor.Otra consideración: para distancias de valor real, la distancia al cuadrado siempre será positiva. Si está midiendo el desplazamiento, por ejemplo, es posible que tenga que lidiar con valores negativos y no cuadrarlos.
fuente