2011-05-18 15 views
7

Obtengo una lista de puntos del usuario que hace clic en la pantalla.¿Cómo puedo pedir una lista de puntos para que no se crucen las líneas trazadas?

Y quiero dibujar un polígono basado en estos puntos. El problema es que el usuario puede no estar haciendo clic en el orden correcto (sin intersección de segmentos) para formar un polígono correcto, por lo tanto estoy buscando un fragmento de código que ordene esa lista y organice los puntos en el orden correcto para formar un buen polígono ...

¡Gracias!

imagen = BAD POLY!

enter image description here

-

foto = bueno POLI!

enter image description here

+3

Creo que necesita para definir "el orden correcto" para que seamos capaces de responder a esta un poco mejor. – Tim

+0

@Tim, una "orden correcta" parece ser una sin intersección de segmentos de línea. –

+0

tendrá que ver esta pregunta similar: http://stackoverflow.com/questions/5576017/polygon-drawing –

Respuesta

6

Si usted quiere "envolver" los puntos en un polígono, se puede utilizar cualquier número convex hull finding algoritmos.

+0

sí, vi esto en las bibliotecas de AForge, pero aún así, ¿no sería más fácil ordenar la lista de alguna manera? – Roger

+1

excepto que la lista es bidimensional, por lo que tendrías que "ordenar" haciendo algún tipo de cosa en sentido horario o antihorario desde un punto central. que solo funciona si tienes una imagen como la de arriba. ¿Qué sucede si la persona hace clic en un punto cerca del centro? Es por eso que existen algoritmos como el casco convexo/cóncavo, este problema no es tan simple como crees que es. –

+0

La ordenación a menudo está involucrada (¿siempre?) En un algoritmo de casco convexo. –

1

Puede tomar el centroide de todos los puntos, luego tomar el punto producto de cada punto hacia el centro con un punto de referencia (digamos el primero en la lista) hacia el centro, obtener el ángulo de cada punto en su lista de un vector de referencia arbitrario. Luego ordene esa lista en el ángulo. Eso le dará los puntos en un orden de giro (por ejemplo) en sentido horario, por lo que su línea es simplemente p1 -> p2, p2 -> p3 etc ...

Cuestiones relacionadas