d3 / d3-force

Force-directed graph layout using velocity Verlet integration.
https://d3js.org/d3-force
ISC License
1.8k stars 374 forks source link

consider making .tick() reversable / accept negative iterations #208

Open jleonard-r7 opened 1 year ago

jleonard-r7 commented 1 year ago

This would be a fairly trivial change to: https://github.com/d3/d3-force/blob/main/src/simulation.js#L39-L61

Reverse the arithmetic operations (+= => -=) and decays to excitements (via 1/x).

Would there be any chance you'd be willing to accept a PR for this change?

jleonard-r7 commented 1 year ago

https://scicomp.stackexchange.com/questions/36394/time-reversibility-of-velocity-verlet-algorithm

Fil commented 1 year ago

I'm curious about this. Wouldn't it also work by changing the sign of alpha? Could be nice to prototype in a notebook.

jleonard-r7 commented 1 year ago

As I mentioned, all arithmetic operations need to be reversed (addition to subtraction) and the reciprocals of the multipliers taken and used instead (including those for alpha).

jleonard-r7 commented 1 year ago

Can anyone say if a pull request for this functionality would be accepted?

Fil commented 1 year ago

It would certainly be considered! My question about prototyping is also a way to ask how this could be used in a concrete application.

jleonard-r7 commented 1 year ago

I could imagine the tick being tied to a mouse wheel; up to go forward in time and down to go backward in time. This was our intended use case for a demo animation we are working on.

In fact, such live demos exist on the internet now (attached to a slider control rather than the mouse wheel) but they are either memoizing the computed frames or recomputing from the beginning (neither of which is optimal since they waste either CPU or memory).

See the “frame” sliders on this example: https://observablehq.com/@ben-tanen/a-tutorial-to-using-d3-force-from-someone-who-just-learned-ho