我正在处理一个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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。