{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE TypeFamilies #-} ----------------------------------------------------------------------------- -- | -- Module : Diagrams.ThreeD.Shapes -- Copyright : (c) 2011 diagrams-lib team (see LICENSE) -- License : BSD-style (see LICENSE) -- Maintainer : diagrams-discuss@googlegroups.com -- -- Various three-dimensional shapes. -- ----------------------------------------------------------------------------- module Diagrams.ThreeD.Shapes ( Ellipsoid(..) , sphere ) where import Data.Typeable import Data.AffineSpace import Data.Semigroup import Data.VectorSpace import Diagrams.Core import Diagrams.Solve import Diagrams.ThreeD.Types data Ellipsoid = Ellipsoid T3 deriving Typeable type instance V Ellipsoid = R3 instance Transformable Ellipsoid where transform t1 (Ellipsoid t2) = Ellipsoid (t1 <> t2) instance IsPrim Ellipsoid instance Renderable Ellipsoid NullBackend where render _ _ = mempty sphere :: (Backend b R3, Renderable Ellipsoid b) => Diagram b R3 sphere = mkQD (Prim $ Ellipsoid mempty) (mkEnvelope sphereEnv) (mkTrace sphereTrace) mempty (Query sphereQuery) where sphereEnv v = 1 / magnitude v sphereTrace p v = mkSortedList $ quadForm a b c where a = v <.> v b = 2 *^ p' <.> v c = p' <.> p' - 1 p' = p .-. origin sphereQuery v = Any $ magnitudeSq (v .-. origin) <= 1