【发布时间】:2011-06-21 05:04:57
【问题描述】:
我正在研究一个 Polygon 类,它在 Array[Vec2] 中保存一组顶点(Vec2 是定义 x 和 y 的简单案例类)。
现在,我想实现一个函数,以在 Array[LineSegment] 中返回多边形的边缘(其中 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)的叉积(归一化)产生一个垂直于平面的单位向量)。对吗?
-
是的,没错。请注意,我在二维空间中工作,因此我们甚至不必进行正常操作(当然,除非这有助于找到解决方案)。
标签: scala functional-programming scala-2.8