我正在处理一个polygon类,它在Array [Vec2]中保存一个顶点数组(Vec2是一个定义x和y的简单case类).
现在,我想实现一个函数来返回Array [Linesegment]中多边形的边缘(其中Linesegment也是一个定义start和end的简单case类).
解决方案是创建将每个顶点连接到数组中的下一个顶点的线段,最后将最后一个顶点连接到第一个顶点.
我只习惯于命令式编程,所以这是我的必要方法:
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中定义的滑动方法,但是这似乎是非旋转的,即它不会考虑最后一项后面的第一项,因此不会返回它.
解决方法
当然你可以使用滑动:
(vertices :+ vertices.head) sliding 2