packages feed

graph-rewriting-layout-0.4.1: GraphRewriting/Layout/Force.hs

module GraphRewriting.Layout.Force where

import Data.Vector
import GraphRewriting.Layout.Geometry


type Strength = Scalar → Scalar
type Displacement = Vector2 → Vector2 -- TODO: should be Position
type Force = Strength → Displacement

fsum ∷ [Force] → Force
fsum [] strength pos = pos
fsum fs strength pos = focalPoint [f strength pos | f ← fs]

repulsion ∷ Vector2 → Vector2 → Force
repulsion from pos = force (pos - from)

attraction ∷ Vector2 → Vector2 → Force
attraction towards pos = force (towards - pos)

force ∷ Vector2 → Force
force f strength pos = pos + vnormalise f *| strength (vmag f)