2011-03-02 51 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