我正在研究一个Polygon类,它在Array[Vec2]
中保存了一个顶点数组(Vec2
是一个简单的case类,定义了x和y )。现在寻找一个scala-esque方法迭代通过访问“next”元素的列表
,我想实现的功能在Array[LineSegment]
的多边形的边返回(其中线段再次是一个简单的情况下的类定义开始和结束)。
解决方法是创建线段,将每个顶点连接到数组中的下一个顶点,最后将最后一个顶点连接到第一个顶点。
我只用命令式编程,所以这是我的当务之急做法:
def edges: Array[LineSegment] = {
val result = new Array[LineSegment](vertices.length)
for (i <- 0 to vertices.length - 2) {
result.update(i, LineSegment(vertices.apply(i), vertices.apply(i + 1)))
}
result.update(edges.length - 1, LineSegment(vertices.head, vertices.last))
result
}
这工作得很好,但它的丑陋。我想在这里使用函数式编程的优点,但我有点卡住了。
我的想法是把它像类似于这样:
def edges: Array[LineSegment] = {
for (v <- vertices) yield
LineSegment(v, if (v == vertices.last) vertices.head else /* next? */)
}
的问题是,有没有办法访问鉴于目前项目v
数组中的下一个项目。
我已阅读IterableLike
中定义的sliding
方法,但似乎是非旋转的,即它不会考虑第一个项目在最后一个项目之后,因此不会返回它。
那么对此有什么好的“scala-esque”方法呢?
你能澄清一两件事:你有一组点定义的多边形,所有的谎言在一些平面,它们都隐含一致绕组(即列表连接[ A,B,C]顶点实际上有一个三角形,(BA)和(CA)(归一化)的叉积产生垂直于平面的单位矢量。这是正确的吗? – 2011-02-04 08:28:39
是的,这是正确的。注意我在二维空间中工作,所以我们甚至不必去谈它的正常情况(当然,除非这有助于找到解决方案)。 – pdinklag 2011-02-04 08:42:29