2016-12-02 174 views
2

三角形網格可以說我有個名單如何創建點的名單榆樹

[p1,p2,p3,p4,p5,p6, ...] or [[p1,p2,p3,...],[...]...] 

p1,p2,p3是一個條帶和p4,p5,p6其他。

p1 - p4 - p7 ... 
|/|/| 
p2 - p5 - p8 ... 
|/|/| 
p3 - p6 - p9 ... 
. . . 
. . . 
. . .  

我怎樣才能將其轉化成的

[(p1,p2,p4), (p4,p5,p2), (p2,p3,p5), (p5,p6,p3), ...] 

名單有沒有辦法不用列表轉換成Array UND使用get和處理所有的Maybe小號

回答

2

首先,我們定義如何在一個正方形分成兩個三角形:

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進行優化,但總的算法成立。

+0

只需要瞭解一下這裏發生了什麼問題。 '(tl,tr)::((bl,br):: _ as rest)'表示從列表頭開始獲取2個項目,然後將第二個項目放回到列表中並作爲「rest」存儲。我的理解是否正確? –

+0

正確,這就是主意 –

0

你可以簡單地您的名單上的模式匹配如下:

toMesh: List Float -> List (Float, Float, Float) 
toMesh list = 
    case list of 
    [ p1, p2, p3, p4, p5, p6] -> 
     Just [(p1,p2,p4), (p4,p5,p2), (p2,p3,p5), (p5,p6,p3)] 

    _ -> 
     [] 
+0

可以說我的問題是一個簡化版本,所以列表中會有大約500-1000個點。我會更新問題 –