A particle has a current position, current velocity, and current force acting on it.
Moduleforce-layout-0.4.0.6Haskell2010
Physics.ForceLayout
A simple, Haskell-native simulator for doing force-directed layout, e.g. of trees or graphs.
To use, just create an Ensemble like so:
import Control.Lens ((&), (.~))
import Data.Default.Class (def)
import qualified Data.Map as M
import Linear.Affine
import Linear.V2
import Physics.ForceLayout
e :: Ensemble V2 Double
e = Ensemble [ (edges, hookeForce 0.05 4)
, (allPairs, coulombForce 1)
]
particleMap
where edges = [(1,2), (2,3), (2,5), (3,5), (3,4), (4,5)]
allPairs = [(x,y) | x <- [1..4], y <- [x+1..5]]
particleMap = M.fromList . zip [1..]
. map (initParticle . P . uncurry V2)
$ [ (2.0, 3.1), (6.3, 7.2)
, (0.3, 4.2), (1.6, -1.1)
, (4.8, 2.9)
]Then run a simulation using either simulate (to get the list of all intermediate states) or forceLayout (to get only the ending state):
e' :: Ensemble V2 Double
e' = forceLayout (def & damping .~ 0.8
& energyLimit .~ Just 0.001
& stepLimit .~ Nothing
)
eSee the diagrams-contrib package (http://github.com/diagrams/diagrams-contrib/) for more examples.
- 5 types
- 18 values
- Packageforce-layout-0.4.0.6
- Exports23
- LanguageHaskell2010
- LicenceBSD-3-Clause
- SourceForceLayout.hs
Data structures
10 declarationsCreate an initial particle at rest at a particular location.
Used to uniquely identify particles.
An edge is a pair of particle identifiers.
An Ensemble is a physical configuration of particles. It
consists of a mapping from particle IDs (unique integers) to
particles, and a list of forces that are operative. Each force
has a list of edges to which it applies, and is represented by a
function giving the force between any two points.
Pre-defined forces
3 declarationshookeForce k l p1 p2 computes the force on p1, assuming that
p1 and p2 are connected by a spring with equilibrium length l
and spring constant k.
coulombForce k computes the electrostatic repulsive force
between two charged particles, with constant of proportionality
k.
distForce f p1 p2 computes the force between two points as a
multiple of the unit vector in the direction from p1 to p2,
given a function f which computes the force's magnitude as a
function of the distance between the points.
Running simulations
6 declarationsOptions for customizing a simulation.
Constructors
FLOpts_damping :: nDamping factor to be applied at each step. Should be between 0 and 1. The default is 0.8.
_energyLimit :: Maybe nKinetic energy below which simulation should stop. If
Nothing, pay no attention to kinetic energy. The default isJust 0.001._stepLimit :: Maybe IntMaximum number of simulation steps. If
Nothing, pay no attention to the number of steps. The default isJust 1000.
Instances1Default
Fractional n => Default (ForceLayoutOpts n)Defined in force-layout-0.4.0.6 · Physics.ForceLayout
Simulate a starting ensemble according to the given options, producing a list of all the intermediate ensembles. Useful for, e.g., making an animation. Note that the resulting list could be infinite, if a stepLimit is not specified and either the kinetic energy never falls below the specified threshold, or no energy threshold is specified.
Run a simluation from a starting ensemble, yielding either the
first ensemble to have kinetic energy below the energyLimit (if
given), or the ensemble that results after a number of steps
equal to the stepLimit (if given), whichever comes first.
Otherwise forceLayout will not terminate.
Internals
4 declarationsSimulate one time step for an entire ensemble, with the given damping factor.
Simulate one time step for a particle (assuming the force acting on it has already been computed), with the given damping factor.
Recalculate all the forces acting in the next time step of an ensemble.
Compute the total kinetic energy of an ensemble.