----------------------------------------------------------------------------- -- | -- Module : Diagrams.Points -- Copyright : (c) 2011 diagrams-lib team (see LICENSE) -- License : BSD-style (see LICENSE) -- Maintainer : diagrams-discuss@googlegroups.com -- -- Points in space. For more tools for working with points and -- vectors, see "Linear.Affine". -- ----------------------------------------------------------------------------- module Diagrams.Points ( -- * Points Point (..), origin, (*.) -- * Point-related utilities , centroid , pointDiagram , _Point, lensP ) where import Diagrams.Core (pointDiagram) import Diagrams.Core.Points import Data.Foldable as F import Linear.Affine import Linear.Vector -- | The centroid of a set of /n/ points is their sum divided by /n/. -- Returns the origin for an empty list of points. centroid :: (Additive v, Fractional n) => [Point v n] -> Point v n centroid [] = origin centroid ps = meanV ps {-# INLINE centroid #-} meanV :: (Foldable f, Additive v, Fractional a) => f (v a) -> v a meanV = uncurry (^/) . F.foldl' (\(s,c) e -> (e ^+^ s,c+1)) (zero,0) {-# INLINE meanV #-}