Ver Mensaje Individual
  #1 (permalink)  
Antiguo 02/05/2009, 07:01
Avatar de Covids0020
Covids0020
 
Fecha de Ingreso: septiembre-2003
Ubicación: España
Mensajes: 217
Antigüedad: 20 años, 7 meses
Puntos: 1
Calcular valores más cercanos en array

Umm... wenas. Veamos si me explico bien y no me lío mucho como siempre.
Escribo aquí en PHP porque la aplicación es en PHP pero es un problema genérico creo.

El contexto:
* Tengo un array con X puntos -items- de un mapa, pongamos 20.
* Los puntos tienen sus coordenadas, como es lógico, pero no tienen ordenación alguna, están a boleo :)
* Los puntos son puntos 2D, olvidarse del tema de proyecciones y demás.
Ejemplo del array:
Código PHP:
array
  
168 => 
    array
      
'coords' => 
        array
          
'x' => float 2132.816
          
'y' => float 1050.988
  177 
=> 
    array
      
'coords' => 
        array
          
'x' => float 2148.724
          
'y' => float 1400.774
  178 
=> 
    array
      
'coords' => 
        array
          
'x' => float 2143.421
          
'y' => float 1474.971
  187 
=> 
    array
      
'coords' => 
        array
          
'x' => float 2079.792
          
'y' => float 727.701 
* Tengo la función que me calcula la distancia (euclídea dicen ^^) mediante el teorema de Pitágoras.
Código PHP:
function distanceBetween($point1$point2) {
    return 
sqrt(
        
pow$point2['x'] - $point1['x'], ) + 
        
pow$point2['y'] - $point1['y'], )
    );

El problema:
Reordenar el array (u obtener otro, etc) de acuerdo a la cercanía entre los puntos.

Desarrollo
* Al principio hice ordenaciones de todo tipo sobre los arrays originales y claves en el eje Y o X, pero es obvio que los puntos pueden estar a un lado u otro del eje, calculando las coordenadas geométricas o los metros reales...

* La solución obvia que veo es que tengo que comparar cada item con el resto, obtener el más cercano y guardar otro o reordenar este en base a esto.
Bien, esto no caigo ahora mismo como hacerlo en PHP: No sé si con aplicar una función de usuario al array... recorrerlo e ir haciendo cálculos. Esto último será muy pesado para el sistema actual, ya es un array anidado :(
Pienso en ir guardando los resultados positivos en otro array con el índice de proximidad y luego usarlo para ordenarlos..., o algo así.

Un problema grave que veo es que puede ser una operación muy pesada incluso con pocos puntos. Así que a lo mejor el diseño de la solución es otro y no montar ese array.

...bueno, sigo pensando, que veo que escribir ayuda a verlo más claro además :D
Pero la cuestión es que cualquier aporte puede hacerme ver la solución que quizá sea muy tonta y muy clara pero que no acierto a ver del todo.

---
Esto ya son EXTRAS:

Resultado buscado:
Es para un mapa SVG: Tengo que construir una línea que una los puntos del mapa pero en el array están desordenados.
La línea lo mismo sería continua que saltaría entre puntos alejados.

Desde ya: muchas gracias! ;)
__________________
"La sabiduría comienza donde acaba el conocimiento". Yaris.
http://www.culturadigital.org

Última edición por Covids0020; 02/05/2009 a las 07:09