假设我有一个积分列表
[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
答案 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)]
_ ->
[]