music-score-1.9.0: src/Data/AffineSpace/Point/Offsets.hs
module Data.AffineSpace.Point.Offsets (
offsetPoints,
pointOffsets,
offsetVs,
distanceVs,
-- offsetted,
) where
import Data.AffineSpace
import Data.VectorSpace
import Data.List
import Data.AffineSpace.Point
-- | Lay out a series of vectors from a given point. Return all intermediate points.
--
-- > lenght xs + 1 == length (offsetPoints p xs)
--
-- >>> offsetPoints 0 [1,1,1] :: [Time]
-- [0,1,2,3]
offsetPoints :: AffineSpace p => p -> [Diff p] -> [p]
offsetPoints = scanl (.+^)
-- | Calculate the relative difference between vectors.
--
-- > lenght xs + 1 == length (offsetPoints p xs)
--
-- >>> offsetPoints 0 [1,1,1] :: [Time]
-- [0,1,2,3]
pointOffsets :: AffineSpace p => p -> [p] -> [Diff p]
pointOffsets or = (zeroV :) . snd . mapAccumL g or
where
g prev p = (p, p .-. prev)
-- How they should really have been defined
-- |
-- For all p
-- > offsetVs p . distanceVs p = id
-- > distanceVs p . offsetVs p = id
offsetVs :: AffineSpace p => p -> [Diff p] -> [p]
offsetVs p = tail . offsetPoints p
distanceVs :: AffineSpace p => p -> [p] -> [Diff p]
distanceVs p = tail . pointOffsets p
{-
offsetted :: AffineSpace p => p -> Iso' [Diff p] [p]
offsetted = iso distanceVs offsetVs
-}