Introducción
Este verano estoy trabajando en un departamento de tecnología en Västerås. He trabajado en la misma empresa y en aproximadamente el mismo cargo durante tres veranos seguidos. El trabajo es muy técnico, divertido y desafiante. A diferencia de otros muchos puestos de trabajo de verano en una oficina, me encontré con una que tengo la responsabilidad y la oportunidad de trabajar con las tareas comunes. Específicamente con los que trabajo a desarrollar herramientas para simplificar el trabajo de cálculo utilizando la mayoría de Matlab, la programación GUI y Java. El nuevo estilo orientado a objetos de MATLAB hace que el código mucho más claro que hace unos años.
El problema
El otro día me enfrenté a un pequeño reto. Simplificado se centró en la búsqueda de un polígono que encierra un conjunto de puntos complejos que se encuentran dispersos en el plano. En un primer momento no he encontrado la función que hace esto en Matlab, que por supuesto era extraño. Por lo tanto, decidió buscar un algoritmo personalizado. En este post voy a describir mi algoritmo.
Mi Alogritm
Voy a describir mi algoritmo usando la Figura 2. Para empezar, voy a explicar la dificultad de encontrar vivienda. La cosa es que todos los puntos sin clasificar en una estructura. Si los puntos se ordenan en torno a un punto central, se puede utilizar el orden y la distancia desde el centro para resolver el problema. Se necesitan al menos O (n log (n)) para hacer una relación lineal ordenados. Mi algoritmo funciona en la lista de seleccionados y probablemente incluso más tiempo, no han obtenido ninguna prueba.
La idea es al menos para empezar con mi punto de vista en la dirección x y luego encontrar el punto en que el valor de k se convierte en el máximo. es decir, calcular:
max (K_i) = (y_min - y_i) / (x_min - x_i) para i = [todos los temas] Esto le da el punto de p_2..
Todos los puntos de menor valor y que X_min puede ser excluido. Todos los puntos con un valor de x menor que p_2 también podría ser descartado para la lectura adicional.
k_2 encuentra, encontrando el punto que minimiza:
k_1 - (y_1 - y_i) / (x_1 - x_i) para i = [todos los elementos no excluidos]
De la misma manera encontró k_a en general por:
min (k_a-1 - (y_a-1 - y_i) / (x_a-1 - x_i)) para i = [todos los elementos no excluidos]
El cálculo se hace por la parte superior del polígono hasta llegar al punto, que es máxima en la dirección x. Después de eso, el mismo algoritmo para la mitad inferior del polígono.
Rendimiento
El desempeño del algoritmo depende de la cantidad de puntos que terminan en polygonet. Yo linjärsök como muchos de la lista a medida que se señala en polygonet. Esto significa que la complejidad es O (N * el número de búsquedas). El número de puntos en el polygonet óptima es entre 10 y 25 dependiendo de los puntos de su oportunidad. El algoritmo es relativamente rápido.
Código
El código no es público.
Solución Matlab - convexo
Mi algoritmo hace lo mismo que la función de Matlab convhull . Convexo es así, la palabra Inglés para un polígono cerrado o un cuerpo convexo. Otro buen recurso es http://en.wikipedia.org/wiki/Convex_hull_algorithms explicando que el tiempo mínimo teórico para encontrar una concha convexa es del orden O (n log (n)).








