Я работаю над классом 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? */)
}
Проблема в том,что нет способа получить доступ к элементу next в массиве, учитывая текущий элемент v
.
Я читал о методе sliding
, определенном в IterableLike
, однако этокажется, что он не вращается, то есть он не будет считать первый элемент последующим за последним элементом и, следовательно, не будет возвращать его.
Так что же является хорошим подходом "scala-esque" к этому?