2011-03-02 52 views
6

我正在Clojure中編寫一個算法,該算法需要一組代表多邊形的點。另一個輸入是一個點,輸出需要是點是否位於多邊形內部。向clojure函數輸入一組點

我的問題是如何向功能輸入一組點? clojure中的數據結構最合適 - 集合,向量,列表等?

回答

4

通常你應該從最簡單的可能解決方案開始,所以在這種情況下,我可能會用一系列點來做,每個點表示爲一個二維矢量,例如,

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

這應該是你的應用程序的罰款。

但是這取決於你最終想要如何使用/在未來maniplulate這些多邊形有一些替代方案來考慮:

  • 如果你想互操作與Java代碼(例如,使用Swing的繪製多邊形框架/ Java2D),您可能希望使用適當Java類的實例(例如java.awt.geom.Point2D的一個子類)作爲單獨的點。這會給你少慣用的Clojure代碼,但會給你更好的Java互操作
  • 你可能想使用一個向量而不是列表的 - 特別是如果你將要使用大量的多邊形和應用需要不同的算法索引訪問到個人點
+0

感謝您的代碼片段。但是,如何修改它以返回向量輸入列表的第一個元素? (我是clojure語法的新手) – Pranav 2011-03-02 15:35:29

+0

那麼你可以做「(第一個我的多邊形)」來獲得[0 0]例如 - 你的意思是?和「(休息我的多邊形)」會給你的剩餘點列表,假設你想寫一些形式的函數迭代或遞歸這些。 – mikera 2011-03-02 15:41:46

+0

基本上我的問題是 - 爲什麼下面的代碼會給出錯誤 - (def in-poly [arg] (first arg)) – Pranav 2011-03-02 15:49:55

7

推測點的順序很重要,這樣形狀ABCD與形狀ABDC不一樣嗎?

在這種情況下,您需要某種保存順序的數據結構。這意味着列表或向量是可以接受的,但是一個集合不是。

但是你也可以編寫你的函數來獲取seqable的任何東西 - 這樣如果你以後想要從向量更改爲list或者反過來,你不必改變你的函數。編程到一個接口,而不是一個實現。

+0

+1對於seqable建議特別是! – mikera 2011-03-02 15:19:20