Programación Específica > Diseño de Algoritmos
Interpolación de valores
aTx:
Intentare implementar lo que dices, aunque ahora mismo estoy un poco perdido... Ya te iré contando como voy.
Por cierto, he hallado otros recursos para lo que busco por internet:
codeproject .com /KB/cs/ScoOterVisualizationPart2.aspx
mysite. verizon .net /~vze2vrva/thesis.html
Nebire:
Para no estar dando palos de ciego.... :hitcomp: prueba los cambios en tu algorimo con una función muy útil para estos casos llamada 'función de Rosembrock'... posiblemente encuentres más info en inglés que en español...
aTx:
Hola, estoy de nuevo por aquí xD
He intentado implementar el algoritmo que me dijiste, aunque no lo he conseguido completamente creo al menos las ideas principales si están implementadas. Por ahora estoy es lo que consigo para plotear el valor 0,6:
[attachment=1:1dcczbkc]plot.png[/attachment:1dcczbkc]
En la imagen se ve para cada punto, su orden de dibujo. Si uniese ordenadamente las líneas, como en un juego de niños, no saldría la figura correcta, como me pasaba en casos anteriores. ¿Tienes alguna idea para solucionar esto?
Te adjunto un archivo de log que creo que puede serte muy útil para comprender lo que intento explicar. Un Saludo.
[attachment=0:1dcczbkc]log.txt[/attachment:1dcczbkc]
Nebire:
--- Cita de: "aTx" ---Hola, estoy de nuevo por aquí xD
En la imagen se ve para cada punto, su orden de dibujo. Si uniese ordenadamente las líneas, como en un juego de niños, no saldría la figura correcta, como me pasaba en casos anteriores. ¿Tienes alguna idea para solucionar esto?
--- Fin de la cita ---
Te contesto rápidamente y mañana con más tranquilidad reviso el archivo y le dedico un poco más de tiempo: Dada una secuencia como la que tienes ahora, para que no se desvirtúe si se sigue el 'orden', hay que proceder de una manera similar a la siguiente:
a ) empezamos por un extremo (localizar un punto tal que al norte no tenga más o si es por abajo al sur no tenga más, o si es a los costados ídem...) en el caso que están todos dispuestos casi verticalmente es relativamente fácil, otra cosa es cuando ýa describen un área cerrada.) igualmente encontrar el otro extremo...
b ) desde dicho punto medir la distancia hasta el otro extremo P0(x,y) - Pn(x,y) y dividirlo entre el total de puntos. a este valor lo llamaremos algo así como paso. será una constante a la que recurrimos al inicio de cada elemento del bucle dentro del bucle otra variable con este valor inicial podrá irr variando, no es un valor fijo, sólo es una aproximación de entrada...
c )Iniciar un bucle encontrar siguiente elemento : iniciar bucle localiz_puntos_enradio mientras_no_se_encuentren_puntos_ aumentar el área: intentoslocalizar +=1: distancia= paso * intentoslocalizar; Con la distancia distancia averiguar que puntos caen dentro de ese círculo con respecto al punto actual (ahora en este justo instante sería el punto P0,) y descartar de esta matriz de posibles los que ya con anterioridad se hubieran encontrado y admitidos en la secuencia (más adelante se explica esto), el área a barrer podría ser circular o cuadrada, cuadrada es más cómoda de recorrer pero también menos exacta, si el área es cuadrada, convendría que fuera impar para que el punto de referencia esté justo en el centro y eliminar dudas).
c1 ) si no se encontró pntos en ese espacio aumentar distancia por un factor a discreción (paso se obtuvo como una referencia de densidad, pero evidentemente si hubiera una distribución ampliamente lateral aparte de vertical la posibilidad de no hallar puntos a una distancia dada aumentaría), el factor puedes decidirlo de entrada como acumulativo (1,2,3,4,5,6.. sea de radio o de área) una vez cierta experiencia quizás si hay un patrón decidas ajustarlo.
c2 ) se encuentran puntos: se totalizan y se obtiene el punto más cercano. Finaliza este bucle, distancia volverá a ser= a paso, repetimos bucle global hasta alcanzar el último punto (que debería ser otro extremo ). Pueden darse casos de equidistancia típicos de un triángulo,( es harto difícil que hubiera más de 2 equidistantes si el trazado es correcto) en dicho caso se debería tomar el más 'extraño' . El más extraño sería una especie de componente, que se las trae, pero que te explico, sobre la línea imaginaria entre el extremo inferior y superior el más extraño es el que: c2a ) si el punto actual está más cerca que los puntos de la línea, el que más se aparta a dicha línea. c2b ) si el punto actual está más lejos que ambos, igual que el paso anterior, c2c ) si el punto actual está aun lado de la línea y los puntos al otro lado el más cercano a la línea, por fin c2d ) si el punto actual está a un lado y los otrs puntos uno a cada lado de la línea, el que está al mismo lado de la línea. (haciendo unos pequeños dibujos a manos se ve menos lioso que tanta palabra). Trataré de hacer mañana un dibujito sencillo mostrando los 4 casos. Es harto difícil demostrar que el más extraño sea la mejor opción, digamos que abre la posibilidad a no perder nodos teniendo que volver hacia atrás (a veces esto no sólo no es indeseable sino necesario, según el digujo).
d ) Paso retomar el estado inicial (cuando lo calculamos por primera vez) vaciamos la matriz de puntos cercanos, los puntos ya marcados se van indicando en la matriz encontrados, ahora cuando busquemos puntos para un radio cuando se encuentren todos, la matriz de posibles serán esos menos los ya encontrados, es decir rechazaremos los que consten en la matriz encontrados... el ciclo se repite hasta llegar al último punto.
e ) tras alcanzar el último punto hay que verificar si el tamaño de la matriz encontrados es igual al tamaño total de puntos, ya que puede darse un caso extremo (o menos). Por ejemplo supongamos que en ese trazado (el último dibujo que tienes) hubiera un punto en 407... debemos considerarlo un error en el algoritmo o debemos considerarlo un punto erróneo (ruido) durante el marcado ???. En ese momento tu debes interpretar ( no coonozco claramente el objetivo final) si es un fallo en el algoritmo o una detección de ruido que el algoritmo consigue filtrar... y si en el punto 407 hay varios puntos formando una isla (redundando) aislada a cierta distancia del resto ???. Para solucionar casos así es necesario saber como se debe interpretar, como yo desconozco ese punto, si te sucede y te quedas atascado me das alguna razón del porqué esos puntos para buscar una opción válida al caso que necesites.
Nota que está todo un poco desordenado ya que es una respuesta rápida... con un lápiz y un trozo de papel entresaca en seudocódigo el algoritmo que subyace.
Para facilitar todas las tareas de localización en vez de buscar en el mapa del dibujo es mejor (supongo que así lo llevas) usar una matriz con una estructura de 3 datos, las cordenadas de cada punto 'x','y' y el 'valor' ( la vas completando cuando lo vas trazando). Así no buscas en superficies vacías del mapa sino en la matriz. al encontrar un punto pasa al índice alto. El primer punto se envía al final de la matriz y se fija un puntero_tope= tamaño_matriz -1, el próximo punto localizado se intercambia con esa posición y se actualiza el puntero puntero_tope= puntero_tope -1, es claro que el bucle finalizará cuando puntero_tope=1.
p.d.: cuando el trazado describe, un área cerrada , se puede empezar arbitrariamente por cualquiera, el otro extremo será el mismo, pero con la consideración que una vez completo el camino, debe examinarse tota la matriz y (si es lo que se desea) romper la cadena justo por los 2 puntos que mas equidisten entre sí dentro de la secuencia. Esto lógicamente será opcional dependiendo de a qué vaya destinado problema.
La línea imaginaria que señalamos más arriba, puede no ser muy correcta si está muy desviada, por ejemplo si la línea de trazos describen una 'C', para estos casos puede usarse una línea imaginaria más inteligente, sumando los valores máximos y mínimos de x, la línea sería el punto proporcional entre esos límites, por ejemplo si el valor x mínimo es 40 y el máximo 120, parecería que debiera ser 80, pero no, 80 es ahora un divisor, repasamos y sumamos todos los valores que sobrepasan 80 y todos los que no llegan por ejemplo valores 100,110,107 y al otro lado 50,55 . entonces (100-80) + (110-80) + (107-80)= 77 y al otro lado (80-55) + (80-50)= 55: 77 - 55= 22 : 22/2=11: linea va en 80 +11 (11 sería la ponderacón). Este ejemplo es referido a un caso donde los extremos tomados fueron verticalmente sea límite superior e inferior si es un camino abierto, si es un camino cerrado debería seguirse una línea redonde o una curva si forma una línea muy curva sin cerrar. Para casos más complejos hay que hacer una detección bordes y usarla como guía respecto del punto actual... trataré de ponerte un ejemplo de este tipo, pués son más útiles de lo que pueda parecer..
Navegación
[*] Página Anterior
Ir a la versión completa