d3 / d3-force

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

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

Open jleonard-r7 opened 2 years ago

jleonard-r7 commented 2 years 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 2 years ago

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

Fil commented 2 years 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 2 years 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 2 years ago

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

Fil commented 2 years 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 2 years 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