如何计算Haskell中网格的法线?

时间:2014-04-09 19:15:45

标签: haskell

我正在尝试并且无法使用Haskell计算三角形网格的法线。

给定顶点列表,每三个连续顶点创建一个三角形:

[a, b, c,    d, e, f,     g, h, i ...]

顶点如下:

type Vertex = (Double, Double, Double, Double)

和正常是:

type Normal = (Double, Double, Double)

我的功能是:

calculateNormals :: [Vertex] -> [Normal]
calculateNormals v = map normalize normals
    where normals = concat $ zipWith3
        (\ a b c -> let normal = cross (c - a) (b - a)
                    in [normal, normal, normal])
        (every 3 v) (every 3 $ drop 1 v) (every 3 $ drop 2 v)
           every n xs = case drop (n - 1) xs of
               (y:ys) -> y : every n ys
               [] -> [[]

函数的要点是,对于每3个顶点,我计算定义三角形的两个向量的叉积,这就是法线。这是我的意图 - 但我不确定这是否正常......

这种方法有明显的错误吗?或者我是如何在Haskell中实现它的?

0 个答案:

没有答案