2011-03-02 8 views
6

Sto scrivendo un algoritmo in Clojure che contiene un insieme di punti che rappresenta un poligono. Un altro input è un punto e l'output deve essere se il punto si trova all'interno del poligono oppure no.Immettere un set di punti per una funzione di clojure

La mia domanda è come inserire l'insieme di punti nella funzione? Quale struttura dati in clojure sarebbe più appropriata? Un set, un vettore, una lista, ecc.?

risposta

4

Di solito dovresti iniziare con la soluzione più semplice possibile, quindi in questo caso probabilmente lo farei con un elenco di punti, con ogni punto espresso come vettore bidimensionale, ad es.

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

Questo dovrebbe andare bene per la vostra applicazione.

Tuttavia a seconda di quanto in ultima analisi, da utilizzare/maniplulate questi poligoni in futuro ci sono alcune alternative da considerare:

  • Se si vuole l'interoperabilità con codice Java (per esempio, il disegno del poligono in un frame utilizzando swing/Java2D), è possibile utilizzare istanze di una classe Java appropriata (ad esempio una delle sottoclassi di java.awt.geom.Point2D) come singoli punti. Ciò fornirà un codice Clojure meno idiomatico, ma offrirà un'interpretazione Java migliore
  • È possibile utilizzare un vettore anziché un elenco - in particolare se si stanno utilizzando poligoni grandi e si applicano algoritmi diversi che richiedono accesso indicizzato ai singoli punti
+0

Grazie per lo snippet di codice. Ma come posso modificarlo per restituire il primo elemento della lista di input dei vettori? (I new to clojure syntax) – Pranav

+0

Beh, puoi fare "(primo mio poligono)" per ottenere [0 0] per esempio - è questo che intendi? E "(Restate my-poligono)" otterrete la lista dei punti rimanenti, assumendo che si voglia scrivere una qualche forma di funzione che itera o ricorre su questi. – mikera

+0

Fondamentalmente la mia domanda è - perché il seguente codice dà un errore - (def in-poly [arg] (primo argomento)) – Pranav

7

Presumibilmente l'ordine dei punti è importante, in modo che la forma ABCD non sia uguale alla forma ABDC?

In tal caso è necessaria una sorta di struttura dati che preservi l'ordine. Ciò significa che una lista o un vettore è accettabile, ma un insieme non lo è.

Ma potresti anche scrivere la tua funzione per prendere tutto ciò che è necessario, in modo che se successivamente desideri passare da un vettore all'altro o viceversa, non devi cambiare la tua funzione. Programma su un'interfaccia, non su un'implementazione.

+0

+1 per la raccomandazione in particolare! – mikera

Problemi correlati