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