首先,我們定義如何在一個正方形分成兩個三角形:
squareToTriangles : a -> a -> a -> a -> List (a, a, a)
squareToTriangles topLeft botLeft topRight botRight =
[ (topLeft, botLeft, topRight)
, (topRight, botRight, botLeft)
]
現在,由於廣場是由兩個列表中,讓我們假設你可以使用元組作爲輸入的列表。現在你可以讓三角形出左/右點的名單:
triangles : List (a, a) -> List (a, a, a)
triangles list =
case list of
(tl, tr) :: ((bl, br) :: _ as rest) ->
List.append
(squareToTriangles tl bl tr br)
(triangles rest)
_ ->
[]
當然,您輸入不涉及元組,所以讓我們定義的東西,需要一個列表的列表作爲輸入:
triangleMesh : List (List a) -> List (a, a, a)
triangleMesh list =
case list of
left :: (right :: _ as rest) ->
List.append
(triangles <| List.map2 (,) left right)
(triangleMesh rest)
_ ->
[]
現在
你可以通過在你的名單列表,使得:
triangleMesh [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
-- yields...
[(1,2,4),(4,5,2),(2,3,5),(5,6,3),(4,5,7),(7,8,5),(5,6,8),(8,9,6)]
注意,這或許可以通過使用更好的方法比List.append
進行優化,但總的算法成立。
只需要瞭解一下這裏發生了什麼問題。 '(tl,tr)::((bl,br):: _ as rest)'表示從列表頭開始獲取2個項目,然後將第二個項目放回到列表中並作爲「rest」存儲。我的理解是否正確? –
正確,這就是主意 –