packages feed

convexHullNd-0.1.0.0: src/Geometry/ConvexHull/Types.hs

{-# LANGUAGE InstanceSigs #-}
module Geometry.ConvexHull.Types
  where
import           Data.IntMap.Strict   ( IntMap )
import qualified Data.IntMap.Strict   as IM
import           Data.IntSet          ( IntSet )
import           Geometry.Qhull.Types ( HasCenter(..)
                                      , HasVolume(..)
                                      , HasEdges(..)
                                      , HasVertices(..)
                                      , HasNormal(..)
                                      , HasFamily(..)
                                      , Family
                                      , EdgeMap
                                      , IndexSet
                                      , IndexMap )

data Vertex = Vertex {
    _point         :: [Double]
  , _neighfacets   :: IntSet
  , _neighvertices :: IndexSet
  , _neighridges   :: IntSet
} deriving Show

data Ridge = Ridge {
    _rvertices :: IndexMap [Double]
  , _ridgeOf   :: IntSet
  , _redges    :: EdgeMap
} deriving Show

instance HasVertices Ridge where
  _vertices :: Ridge -> IndexMap [Double]
  _vertices = _rvertices

instance HasEdges Ridge where
  _edges :: Ridge -> EdgeMap
  _edges = _redges

data Facet = Facet {
    _fvertices    :: IndexMap [Double]
  , _fridges      :: IntSet
  , _centroid     :: [Double]
  , _normal'      :: [Double]
  , _offset'      :: Double
  , _orientation' :: Int
  , _area         :: Double
  , _neighbors    :: IntSet
  , _family'      :: Family
  , _fedges       :: EdgeMap
} deriving Show

instance HasCenter Facet where
  _center :: Facet -> [Double]
  _center = _centroid

instance HasEdges Facet where
  _edges :: Facet -> EdgeMap
  _edges = _fedges

instance HasVertices Facet where
  _vertices :: Facet -> IndexMap [Double]
  _vertices = _fvertices

instance HasNormal Facet where
  _normal :: Facet -> [Double]
  _normal = _normal'
  _offset :: Facet -> Double
  _offset = _offset'

instance HasVolume Facet where
  _volume :: Facet -> Double
  _volume = _area

instance HasFamily Facet where
  _family :: Facet -> Family
  _family = _family'

data ConvexHull = ConvexHull {
    _hvertices  :: IndexMap Vertex
  , _hfacets    :: IntMap Facet
  , _hridges    :: IntMap Ridge
  , _hedges     :: EdgeMap
  , _simplicial :: Bool
  , _dimension  :: Int
} deriving Show

instance HasEdges ConvexHull where
  _edges :: ConvexHull -> EdgeMap
  _edges = _hedges

instance HasVertices ConvexHull where
  _vertices :: ConvexHull -> IndexMap [Double]
  _vertices hull = IM.map _point (_hvertices hull)