如何从Elm中的点列表创建三角形网格

时间:2016-12-02 14:29:26

标签: elm

假设我有一个积分列表

[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并使用get并处理所有Maybe s

2 个答案:

答案 0 :(得分: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更好的方法进行优化,但通用算法仍然存在。

答案 1 :(得分: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)]

    _ ->
      []