2011-03-02 13 views
6

Estoy escribiendo un algoritmo en Clojure que toma un conjunto de puntos que representa un polígono. Otra entrada es un punto, y la salida debe ser si el punto se encuentra dentro del polígono o no.Ingrese un conjunto de puntos a una función clojure

Mi pregunta es ¿cómo ingreso el conjunto de puntos a la función? ¿Qué estructura de datos en clojure sería la más adecuada? ¿Un conjunto, vector, lista, etc.?

Respuesta

4

Normalmente debería comenzar con la solución más simple posible, por lo que en este caso probablemente lo haría con una lista de puntos, con cada punto expresado como un vector bidimensional, p.

(def my-polygon (list [0 0] [1 0] [1 1] [0 1])) 

Esto debería estar bien para su aplicación.

Sin embargo, dependiendo de la forma en que en última instancia desea utilizar/maniplulate estos polígonos en un futuro hay algunas alternativas a considerar:

  • Si desea interoperabilidad con código Java (por ejemplo, dibujar el polígono en un marco usando oscilación/Java2D), es posible que desee utilizar instancias de una clase Java adecuada (por ejemplo, una de las subclases de java.awt.geom.Point2D) como puntos individuales. Esto le dará un código Clojure menos idiomático, pero le dará una interoperación Java mejor
  • Puede usar un vector en lugar de una lista, especialmente si va a utilizar polígonos grandes y aplica diferentes algoritmos que necesitan acceso indexado a los puntos individuales
+0

Gracias por el fragmento de código. ¿Pero cómo lo modifico para devolver el primer elemento de la lista de entrada de vectores? (Nuevo en la sintaxis de clojure) – Pranav

+0

Bueno, puedes hacer "(first my-polygon)" para obtener [0 0] por ejemplo - ¿es eso lo que quieres decir? Y "(rest my-polygon)" obtendrá la lista de los puntos restantes, suponiendo que desea escribir alguna forma de función que repita o itere sobre estos. – mikera

+0

Básicamente mi pregunta es: ¿por qué el siguiente código da un error? (Def in-poly [arg] (primer arg)) – Pranav

7

Probablemente el orden de los puntos es importante, por lo que la forma ABCD no es lo mismo que la forma ABDC?

En cuyo caso necesita algún tipo de estructura de datos que preserve el orden. Esto significa que una lista o vector es aceptable, pero un conjunto no lo es.

Pero también puede escribir su función para tomar cualquier cosa seqable, por lo que si luego desea cambiar de vector a lista o viceversa, no tiene que cambiar su función. Programa a una interfaz, no a una implementación.

+0

+1 para la recomendación seqable en particular! – mikera

Cuestiones relacionadas