Я собрал следующий jfiddle, основанный на некотором коде, который я видел в книге - http://jsfiddle.net/hiwilson1/o3gwejbx/2. В общем, я следую тому, что происходит, но есть несколько аспектов, за которыми я не следую.d3 добавление и удаление узлов с силой
svg.on("mousemove", function() {
var point = d3.mouse(this),
node = {x: point[0], y: point[1]};
svg.append("circle")
.data([node])
.attr("r", 1e-6)
.transition()
.attr("r", 4.5)
.transition()
.delay(1000)
.attr("r", 1e-6)
.remove();
force.nodes().push(node);
force.start();
});
Здесь мы строим нашу новую точку данных и добавляем круг с атрибутами x и y этой точки данных. Я перехожу к радиусу узлов, а затем удаляю() его. Вот бит, который я не соблюдаю - перед удалением его точка данных добавляется в массив force.nodes(), а не сам круг, только точка данных. Затем я начинаю() силу.
- Почему мы удаляем круг, прежде чем нажимать точку данных в массив force.nodes().
- Почему мы нажимаем только точку данных в массив force.nodes(), не нужна ли ссылка на круг? Или круг как-то просто визуальное представление точки данных и манипулирование точкой данных манипулирует кругом?
- Почему мы запускаем силу() при каждом перемещении мыши? Я думал, что сила() зациклилась на заднем плане и не нужно перезапускать после добавления каждого узла?
UPDATE: Я думаю, что я в конечном счете ищу ясность, это то, что на самом деле делает маска force() на капоте.
Теория: вы даете силовой макете массив узлов. Для каждого элемента данных x и y либо предоставляются, либо произвольно назначаются. Как только сила запускается, массив постоянно пересчитывается для перемещения этих компонентов x и y в соответствии с применяемыми дополнительными свойствами силы, такими как гравитация и заряд. Силовая компоновка не имеет ничего общего с визуализацией самих кругов - вам нужно продолжать рисовать их/обновлять свои местоположения x и y, чтобы отражать позиции значений массива, которые манипулирует силой.
Правильно ли это?
RE Первое: я имел в виду раньше, а не после. Почему мы удаляем узел, прежде чем добавлять его в массив force.nodes()? Во-вторых: Истинно, он отбирает все круги, тогда зачем нам нужно выражение force.nodes(). Push (node)? В-третьих: Что это значит, «добавлено к существующей силе»? Можете ли вы рассказать об этом? – hwilson1