Si usted tiene una lista de objetos
Si tuviera todas las posiciones de todos los objetos en una lista, esto sería mucho más fácil, ya que no tendría que buscar todas las casillas vacías y podría realizar 2D distance calculations para determinar el más cercano a usted. Bucle a través de su lista de objetos y calcular la distancia de la siguiente manera:
Define your two points. Point 1 at (x1, y1) and Point 2 at (x2, y2).
xd = x2-x1
yd = y2-y1
Distance = SquareRoot(xd*xd + yd*yd)
Luego Sólo tiene que elegir el que tenga la distancia más corta.
Si sólo tiene una matriz 2D
Sin embargo, si el problema que se describe asume una matriz 2D, donde la ubicación de los objetos no se pueden enumerar sin primero la búsqueda de todos ellos, entonces usted va a tener hacer un ciclo en espiral
La búsqueda de 'Spiral Search Method' ofrece algunos enlaces interesantes. Here is some code that does a spiral loop alrededor de una matriz, sin embargo, esto no funciona desde un punto arbitrario y sale en espiral hacia afuera, pero debe darle algunas buenas ideas sobre cómo lograr lo que desea.
Aquí hay un similar question sobre el llenado de valores en orden espiral en una matriz 2D.
De todos modos, aquí es cómo iba a abordar el problema:
punto P
Teniendo en cuenta, crear un par de vectores que especifica un área alrededor de P
.
Así que si P = 4,4
Luego, su par de vectores habría 3,3|5,5
Loop cada valor de esos límites.
for x = 3 to 5
for y = 3 to 5
check(x,y)
next
next
Si se encuentra un valor, salga. Si no, aumente los límites en uno nuevamente. Entonces, en este caso iríamos a 2,2 | 6,6
Al hacer un bucle para verificar los valores, asegurarnos de que no hemos entrado en ningún índice negativo, y también asegurarnos de no haber excedido el tamaño de la matriz .
Además, si amplía los límites n veces, solo necesita realizar un bucle en los valores del límite exterior, no necesita volver a comprobar los valores internos.
¿Qué método es más rápido?
Todo depende de:
- La densidad de la matriz
- técnica Distribución
- Número de objetos
Densidad de la matriz
Si tiene una matriz de 500x500 con 2 ob Jects en él, entonces looping la lista siempre superan a haciendo una espiral
técnica Distribución
Si existen patrones de distribución (es decir, los objetos tienden a agruparse alrededor de la otra), entonces una espiral puede llevar a cabo con mayor rapidez.
Número de objetos
Una espiral probablemente le hará más rápido si hay un millón de objetos, como la técnica de la lista requiere que verificar y calcular todas las distancias.
Debería poder calcular la solución más rápida calculando la probabilidad de que se llene un espacio, en comparación con el hecho de que la solución de la lista debe verificar cada objeto en todo momento.
Sin embargo, con la técnica de lista, es posible que pueda hacer una clasificación inteligente para mejorar el rendimiento. Probablemente valga la pena investigarlo.
¿Una grilla infinita? –
Aparte: la medición de distancia que describes se conoce generalmente como "distancia de Manhattan", o más matemáticamente como distancia L1. – Thomas