我正在研究一個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