2016-11-22 2 views
1

Я прорисовывал ориентированный график: JSBin. Я хочу, чтобы график был первоначально отображен силами, но затем пользователи могут свободно перемещать узлы. Есть два варианта: любой из них подходит для меня:Отключить силы после отображения графика силы

1) Когда график отображается, я хочу, чтобы можно было перетащить любой узел в любую позицию, сила не вмешивается; длина ссылок будет автоматически скорректирована

2) Когда график отображается, я хочу, чтобы иметь возможность перетаскивать узлы, длина ссылок может оставаться неизменной, но я не хочу, чтобы сила , чтобы вмешаться, чтобы автоматически изменить положение других узлов.

Я попытался изменить .charge(-300), но он не работает, холодно, кто-нибудь поможет?

Edit 1:

Я добавил force.nodes([]): JSBin, но он не работает, как ожидалось ...

+0

Там может быть два подходов отличается от того, что было предложено ответить Марка. Какой из них выбрать во многом зависит от: 1) Вы хотите, чтобы поведение перетаскивания продолжалось, пока сила еще не запущена или только после того, как она остановилась? 2) Будет ли компоновка силы когда-либо повторно нагреваться после того, как она закроется? – altocumulus

ответ

4

я собираюсь решить для этого:

1) После того, как появится график, я хочу, чтобы иметь возможность перетащить любой узел любое положение, сила не вмешивается; длина ссылки будет автоматически скорректирована

Первого:

Когда вы сделаете свой прямоугольник или круг, как узлы затем дать ему класс как это:

var circlesOrRects = svg.append("g").selectAll(".foo") 
.data(force.nodes()) 
.enter() 
.append("path") 
.attr("class", "foo")//give it a class 

Далее после силы ориентированного графа останавливает, фиксирует узлы, как показано ниже:

var force = d3.layout.force() 
    .nodes(d3.values(nodes)) 
    .links(links) 
    .size([width, height]) 
    .linkDistance(150) 
    .charge(-300) 
    .on("tick", tick) 
    .start() 
    .on("end", function(p) { 
     //using the class for selecting nodes. 
     d3.selectAll(".foo").each(function(d){ 
     d.fixed=true;//thsi will fix the node. 
     }); 
    }); 

Теперь, после того как сила остановлена, вы можете перетащить свои узлы в любом месте.

Обратите внимание, что событие будет триггрет, когда сила альфа станет 0, только тогда узлы будут зафиксированы.

рабочий код более here

+1

Существует один недостаток , хотя: Это не остановит силу от повторного нагрева при каждом перетаскивании, она просто фиксирует позиции узлов. Если в макете много узлов, это может оказать заметное влияние на общую производительность. – altocumulus

+0

Да, возможно, слишком многие узлы могут быть проблемой, поскольку вы предлагаете .. – Cyril

0

Чтобы вручную остановить направленный граф силы, вы можете просто позвонить force.stop().

Что вы описали, это предотвращение повторного запуска силы при внесении каких-либо изменений. Есть несколько способов, которыми вы могли бы это сделать, я думаю, что лучше всего было бы «отделить» узлы от графика, ориентированного по силе.

Для этого просто позвоните force.nodes([]). Теперь граф, ориентированный на силу, работает с пустым графом, и вы можете продолжать использовать свои узлы. Для того, чтобы сделать это после первоначального макета вы хотите:

force.on("end", function() { 
    force.nodes([]); 
}); 
+0

Стоит отметить, что это справедливо только для D3 v3, но это то, о чем попросил OP. В v3 собственное сопротивление силы перегрело силу на каждом событии перетаскивания. В версии 4 компоновка сил была отделена от поведения перетаскивания, в результате чего события перетаскивания не восстанавливали макет. Я видел, по крайней мере, один вопрос, требующий полной противоположности при использовании v4: «Почему моя симуляция не запускается при перетаскивании?» * – altocumulus

+0

@altocumulus очень благодарен за это разъяснение. У меня еще не было шанса использовать v4 силы - не осознал, что поведение изменилось. – Ian

+0

Спасибо за ваш ответ, но я не вижу, куда положить 'force.on (« end ... ». Я положил его в конец скрипта JavaScript, он не работал ... – SoftTimur

Смежные вопросы