graph-rewriting-layout-0.4.4: GraphRewriting/Layout/SpringEmbedder.hs
module GraphRewriting.Layout.SpringEmbedder where
import GraphRewriting.Graph
import GraphRewriting.Graph.Read
import GraphRewriting.Layout.Position
import GraphRewriting.Layout.PortSpec
import GraphRewriting.Layout.Rotation
import GraphRewriting.Layout.RotPortSpec
import GraphRewriting.Layout.Force
import Control.Monad
import Data.Vector.Class
springForce ∷ (View [Port] n, View Position n, View Rotation n, PortSpec n) ⇒ Double → Node → WithGraph n Force
springForce springLength n = liftM fsum $ mapM edgeForce =<< attachedEdges n where
edgeForce e = do
ns ← adverseNodes n e
nTs ← springTargets e n
nsTs ← liftM concat $ mapM (springTargets e) ns
return $ fsum [attraction nsT nT | nsT ← nsTs, nT ← nTs]
springTargets e node = do
ps ← liftM (propOfPort absRotPortSpec e) (readNode node)
return $ map (\(p,dir) → p + vnormalise dir |* springLength) ps