gpt4 book ai didi

haskell - "circular list"中相邻元素对的延迟生成

转载 作者:行者123 更新时间:2023-12-02 13:39:12 27 4
gpt4 key购买 nike

为了检查光线与三角形的碰撞,我们可以首先查看光线是否与三角形的平面发生碰撞。如果是,我们然后检查所有三角形边的交点是否在同一边。如果为真,则意味着该点位于三角形内部。此过程与矩形和其他凸图形类似。

这是属于矩形的顶点列表(逆时针排序):

vertexes = [ll, lr, ur, ul]

我想生成一个包含所有边的列表;即所有相邻的顶点对:

vertexPairs = [(ll, lr), (lr, ur), (ur, ul), (ul, ll)]

(请注意,最后一个顶点 ul 也与第一个顶点 ll 配对)

假设我有其顶点的有序列表,如何惰性为通用凸几何图形生成这样的列表?

<小时/>

这个想法是将每个对提供给一个函数,isInside,并检查其所有返回值是否相同。这就是我正在做的事情:

1.  vertexes = [<list of vertexes>]
2. vertexPairs = ???
3. results = map (\(v1, v2) -> isInside point v1 v2) vertexPairs
4. allequal = all (== head results) (tail results)

由于 Haskell 是惰性的,如果对 isInside 的调用返回的值与第一次调用的返回值不同,则对 all 的调用就会结束(第 4 行)。同样,我想要一种以惰性方式生成vertexPairs列表的方法。

<小时/>

当我写这个问题时,我想到了一个可能的解决方案来生成这些对:

vertexPairs = zip (vertexes) (tail vertexes ++ [head vertexes])
  1. 这是懒惰吗?我会这么说,因为它不使用 last 或类似的函数,但我对 Haskell 还比较陌生。
  2. 由于串联和单元素列表。有更好的办法吗?
  3. 作为一个相关问题,第 3 行的自由点表示法应该是什么?

最佳答案

虽然 tikhon 已经回答了大多数问题,但如果你想以稍微漂亮的方式编写它,你可以这样做


vertexPairs v = zip v (tail $cycle v)

这是有效的,因为zip在其参数之一“用完”时停止生成列表

关于haskell - "circular list"中相邻元素对的延迟生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16265189/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com