LoginSignup
1
3

More than 5 years have passed since last update.

D3.js (v4.x) forceSimulation with Canvas

Posted at

数年ぶりに D3.js の forceLayout を使おうと思ったらメジャーバージョンアップでいろいろと変わっていたので備忘録を兼ねたメモを残します。

シナリオ

  • 時間とともにノード、リンクが増えていく無向グラフを実装
  • レンダリングには Canvas を使う
  • ノードのドラッグで干渉できるようにする
  • Canvas のリサイズにも追従

デモ

こちらから。 毎秒ノード/リンクが追加されていきます。
https://bl.ocks.org/frogcat/a06132f64b7164c1b1993c49dcd9178f

image

感想

  • tick ごとに Canvas の再描画をするような実装
  • SVG 固有の enter/exit みたいなことを考える必要がないのでその点は楽
  • たぶん速度的には Canvas のほうが有利なんだろう
  • ノードのドラッグは 公式の Force Dragging III をコピペしてどうにか
  • forceSimulation.find(x,y,radius) を使うことでマウスポインタとノードの当たり判定をやっているようだ
  • リンクへの当たり判定なんかは難しいかも
  • 有向グラフにする場合は Canvas でがんばって Arrow Head を書けばいいのでなんとかなるのではないか (SVG だと marker 使ったりとか逆に選択肢が多くて悩む)
  • この目的だとそもそも http://sigmajs.org/ でいいんじゃね?という疑問は常につきまとう

参考

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3