我有一些类似于力导向图示例的东西。主要区别在于没有强制力——布局是静态的,除了用户拖动交互。我添加了在用户定义的节点组周围绘制凸包(作为 svg:path 元素)的代码。随着节点的移动(即.on("drag")
),计算外壳的代码被触发。这意味着当节点被拖动时它会不断触发。通常有 10 到 30 个船体;一个节点可能在一个或多个外壳中。见下文:
我试图弄清楚是否有更有效(更高性能)的方式来做我正在做的事情。暂时保持高水平:
拖动时,更新所有船体图形:
- 对于每个船体,创建组成节点坐标的数组。
- 将上述数组中的每个坐标对替换为与原始点相距一定距离r的 8 个点。这是为了填充/扩张船体,因此它实际上不会接触任何节点。
- 将计算出的坐标馈送到
d3.geom.hull
.
我在 Chrome 中获得了大约 50 fps,这一点也不差,但它似乎是一个非常低效的设置。
我唯一明确的想法是将节点包含在节点数组中的船体的 ID 存储在节点数组中,并且只更新那个/那些船体而不是所有船体。我还想知道更有效的数据结构来存储船体数据(而不是路径本身)。目前数据结构如下所示:
hulls = {1:{nodeIDs:[1,2,3,4,5], name:"hull1"}, 2:{...}, ...};
请原谅这个开放式问题,但我希望有一些我不熟悉的编程技术在这里可以很好地工作。