我正在一个haskell程序中实现CSG。 当我在OOP lahguage中做到这一点时,我受到了复合赞助人的启发。
我有一个抽象类“对象”,一些具体对象(球体,平面等),以及一个具体的类“CompositeObject”,其中包含一个运算符和两个指向Object的指针。
要在Haskell中以这种方式实现CSG树,我正在考虑递归数据类型:
data Shape = Sphere (..some types here..)
| ..other primitive objects..
| Composite Shape Op Shape
然后我通过模式匹配来定义对象上的函数。 这里的问题是所有对象都必须在此模块中。所有物体都集中在整体中。
我认为拥有对象的类型类是个好主意:
class Shape a where
intersection :: Ray -> a -> [Points]
normal :: Point -> a -> Vector
...
现在我为Sphere,plane,cilinder等定义实例
但复合对象怎么样?如何创建一个由两种类型构造的类型,类函数取决于构造函数,或类似的东西?
答案 0 :(得分:8)
通常的模式是跳过课程并将其设为数据,如下所示:
data Shape = Shape
{ intersection :: Ray -> [Point]
, normal :: Point -> Vector
}
然后你会有sphere
这样的函数占据一个位置和一个半径并产生一个Shape
;或者是一个复合对象,它占用了两个Shape
并用它们做了一些事情。