2011-09-10 21 views
7

Tengo un polígono convexo ABCDE ... (puede tener cualquier cantidad de puntos). Necesito ordenar todos sus vértices para que ninguno de los bordes se crucen.
ejemplo: bordesOrdenando los puntos del polígono

A _____ B 
    \ /
    \/
    X 
/\ 
    /___\ 
C  D 

ese polígono con el fin ABCD ha de intersección. sin embargo, en orden ABDC:

A _____ B 
    | | 
    | | 
    | | 
    | | 
    |___| 
C  D 

Ninguno de los bordes se cruza, por lo que ABDC es la salida esperada.

¿Cómo puedo hacer esto?

+0

Ver también: http://stackoverflow.com/q/828905/310574 – Gabe

Respuesta

8

Suponiendo que sus puntos están todos en la envolvente convexa de su polígono, se puede usar la siguiente:

  1. escoger los dos puntos extremos con el mínimo y el valor máximo de X, (llamarlos X min y X max) y trazar la línea entre ellos. En el caso de que tenga puntos múltiples con el mismo valor de X en los extremos, elija X min con el valor Y mínimo y X max con el valor Y máximo.
  2. Dividir la lista de puntos en dos listas sub donde todos los puntos por debajo de la línea que conecta X min y X max están en una lista y todos aquellos por encima de la línea son en otro. Incluya X min en la primera lista y X max en la segunda.
  3. Ordene la primera lista en orden ascendente del valor X. Si tiene varios puntos con el mismo valor de X, ordénelos en valor Y ascendente. Esto solo debería ocurrir para puntos con el mismo componente X que X max ya que el polígono es convexo.
  4. Ordene la segunda lista en orden descendente de valor X. Nuevamente, clasifique el valor Y descendiente en el caso de puntos múltiples con el mismo valor X (que solo debería ocurrir para los puntos con el componente X X min.
  5. Adjunte las dos listas (no importa cuál sea el primero .)
+1

FYI:!. no hay absolutamente ninguna necesidad de utilizar las funciones trigonométricas inversas para ordenar los puntos radialmente Usted puede simplemente ordenar basado en el valor real (y - y0)/(x-x0). Ese es el núcleo del escaneo Graham –

+0

@Foo Bah: gracias por señalar. No estaba claro por su respuesta. Por cierto, ¿no votó por el ¿respuesta? Si es así, ¿por qué lo editó? – andand

+0

Lo edité porque quería deshacer mi voto negativo, luego me olvidé de hacerlo después. Lo he eliminado ahora. –

8

elija dos puntos en el polígono. el punto medio de la línea estará contenido dentro de ese polígono. Permita que ese punto sea M.

Luego, ordene los puntos según el ángulo basado en M (a lo largo del eje X), rompiendo la degeneración en función de la distancia desde M. Iterar en ese orden asegura que no se crucen dos bordes.

+0

brillante idea – mr5

Cuestiones relacionadas