【问题标题】:Constructive solid Geometry in functional programming函数式编程中的构造实体几何
【发布时间】:2014-02-16 16:36:42
【问题描述】:

我正在一个 haskell 程序中实现 CSG。 当我在 OOP 语言中这样做时,我受到了 Composite Patron 的启发。

我有一个抽象类“Object”、一些具体对象(球体、平面等)和一个具体类“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
  ...

现在我为球体、平面、圆柱体等定义实例。

但是复合对象呢?如何创建由两种类型的类构造的类型,类函数取决于构造函数或类似的东西?

【问题讨论】:

    标签: haskell functional-programming typeclass raytracing algebraic-data-types


    【解决方案1】:

    通常的模式是跳过该类并使其成为数据,如下所示:

    data Shape = Shape
        { intersection :: Ray -> [Point]
        , normal       :: Point -> Vector
        }
    

    然后你会有像sphere这样的函数,它获取一个位置和一个半径并产生一个Shape;或者是一个复合对象,它使用了两个 Shapes 并对它们进行了处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      • 1970-01-01
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多