1

我正在用 Haskell 编写一个函数,它采用 aPoint和 aDouble分别表示立方体的中心长度和边长。

一个Pointtype Point = [Double]

函数签名是getCubeFaces :: Cube -> [Face]a Faceisdata Face = Face [Point]和 a Cubeis data Cube = Cube Point Double

我的问题是,我该怎么做呢?我尝试过天真的方法

[ Face [ [-1, 1, 1], [1, 1, 1] ...

并按照他们的 8 分列出所有 6 张面孔——但这真的很难看。

有没有更直观/模式化的方式来解决这个问题(无需访问法线向量)?

4

1 回答 1

4

先让

type Vector = Point
a <+> b = zipWith (+) a b --vector addition
a <*> b = map (*b) a --vector scalar multiplication

然后,我建议两种方法。立方体以 为中心0, 0, 0,边长为2。你可以稍后map (\face -> map (\point -> point <*> sideLength/2 <+> center)。第一的

face :: Vector -> Vector -> Vector -> Face
face x y z = [x <+> (y <*> i) <+> (z <*> j) | i <- [-1, 1], j <- [-1, 1]]

cube :: [Face]
cube = let
    axes = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
    directions = zipWith (\ds i -> map (<*>i) ds) (permutations axes) (cycle [1, -1])
  in map (\[x, y, z] -> face x y z) directions

第二,

cube' :: [Face]
cube' = let
    points = [[x, y, z] | x <- [-1, 1], y <- [-1, 1], z <- [-1, 1]]
    pair i = partition (\x -> x !! i > 0) points
  in map pair [0..2] >>= (\(a, b) -> [a, b]) 

虽然第二个较短,但请注意,当您确定您真正想要的时候,第一个可以让您更加灵活type Face = [Triangle]

于 2013-11-02T08:10:29.113 回答