2010-01-23 8 views
19

Me gustaría calcular la distancia entre dos coordenadas x/y en la superficie de a torus. Entonces, esta es una grilla normal que tiene la propiedad de que sus esquinas y lados están 'conectados'. Por ejemplo, en una cuadrícula de 500x500, el punto en (499, 499) es adyacente a (0, 0) y la distancia entre, p. Ej. (0,0) y (0,495) debería ser 5.Calcular la distancia entre dos coordenadas x/y?

¿Hay alguna buena forma matemática de calcular esto?

+5

Sí, la hay. :-) –

+1

¿Siempre elige la distancia más corta o está especificando una dirección? En otras palabras, ¿por qué la distancia sería de 5 en lugar de 495, o podría ser cualquiera, dependiendo de cómo se quería trazar la línea? –

+0

Sí, se trata de la distancia más corta ... – Ropstah

Respuesta

48

Así que estás buscando la distancia euclidiana en la superficie bidimensional de un toro, según tengo entendido.

sqrt(min(|x1 - x2|, w - |x1 - x2|)^2 + min(|y1 - y2|, h - |y1-y2|)^2) 

donde w y h son la anchura (x) y la altura (y) de la rejilla, respectivamente.

+1

+1, creo que tu respuesta es más matemática que la mía :) – Yoni

+0

Elegante! ¡Matemático! ¡Voto ascendente! –

+0

Muy buena solución. –

6
  • Si/mientras que la distancia entre las coordenadas x es mayor que la mitad del tamaño de cuadrícula X, añadir tamaño de la cuadrícula X a los x más pequeñas de coordenadas.
  • Haga lo mismo con Y.
  • Luego calcule la distancia.
+0

Buena explicación de los hechos :) – Ropstah

1

para los puntos (x1, y1) y (x2, y2), es necesario calcular 4 distancias:

  • a partir de (x1, y1) hasta (x2, y2)
  • a partir de (x1, y1) a (x2, 500-y2)
  • a partir de (x1, y1) a (500-x2, y2)
  • a partir de (x1, y1) a (500-x2, 500-y2)

y luego tome el mínimo de esos.

+0

Esto no funciona: pruébalo con (0,200) y (0,300). ¡Eso da una distancia de 0 con la segunda fórmula! Además, como se afirma (o al menos implícita) en otras respuestas, primero se puede calcular la distancia x corta y la más corta; entonces solo necesitas aplicar el teorema de Pitágoras una vez. – BobS

+0

gracias, me corresponde corregido – Yoni

3

Si su cuadrícula se ajusta en los bordes, habrá cuatro distancias entre cada coordenada (para 2 dimensiones). Supongo que quieres saber la distancia más corta.

Usemos una grilla más pequeña, los números son un poco más manejables. Supongamos que la cuadrícula es 10x10. Usemos también una sola dimensión para simplificar (en cuyo caso solo habrá dos distancias), tal como lo hizo en su ejemplo. Digamos que tenemos los puntos 0,2 y 0,6. Las dos distancias entre los puntos son d_1 = (6-2) = 4 y d_2 = (10-6) + 2 = 6, por lo que en este caso la distancia más corta sería d_1.

En general, se puede hacer lo siguiente:

  • Para cada coordenada:
    • restar el más pequeño a partir del número más grande
    • si el resultado es mayor que la mitad de la anchura de la rejilla la distancia más corta en esta coordenada es el ancho de la cuadrícula menos el resultado
    • si el resultado es menos de la mitad del ancho de la cuadrícula, la distancia más corta en esta coordenada es el resultado

Luego, utilizando el teorema de Pitágoras, la distancia más corta entre dos puntos es la raíz cuadrada de la suma de los cuadrados de las distancias más cortas en cada dirección. Puede calcular las otras tres distancias calculando el teorema de Pitágoras usando las otras combinaciones de distancias en cada dirección.

Como ha dicho otro afiche, la forma que se forma cuando se envuelve alrededor de los bordes (para una rejilla bidimensional) es un toro y creo que el método que he usado anteriormente es el mismo que la ecuación dada pero tiene ventaja de que se puede extender a n dimensiones si es necesario. Lamentablemente, no hay una visualización fácil por encima de 2 dimensiones.

+0

Voto a título de la información para la explicación detallada. –

Cuestiones relacionadas