要检查射线与三角形的碰撞,我们可以首先查看射线是否与三角形的平面发生碰撞。如果是这样,我们然后检查交点是否在所有三角形边的同一侧。如果为真,则表示该点位于三角形内部。此过程类似于矩形和其他凸形图形。
这是属于矩形的顶点列表(逆时针顺序):
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])
- 这是懒惰吗?我会这么说,因为它不使用last或类似的功能,但我对 Haskell 还是比较陌生。
- 由于串联和单元素列表,它看起来也有点难看。有没有更好的办法?
- 作为一个相关的问题,第 3 行的自由点符号应该是什么?