d3.js, управляющий начальной анимацией в силовом макете

Я много читал о влиянии на начальную анимацию макета сил, но боюсь, что еще не понял этого.

Я нашел (и мог реализовать) этот пример, как его эффективно "остановить" .

Но мой вопрос в том, можно ли это контролировать (т.е. влиять на то, сколько времени потребуется, пока «сила не прекратится»?).

Из документации видно, что альфа — это параметр, который нужно изменить, но это не имеет значения (я пробовал отрицательные значения, ноль и положительное значение без какой-либо заметной разницы).

Вот jsdiddle того, что я пытаюсь сделать: yrscc fiddle того, что Я пытаюсь сделать.

var force = d3.layout.force()
    .nodes(d3.values(datax.nodes))
    .links(datax.links)
    .size([xViewPortArea.Width, xViewPortArea.Height])
    .linkDistance(xGraphParameters.xLinkDistance)
    .charge(xGraphParameters.xCharge)
    .on("tick", tick)
     .alpha(-5)  // HERE 
    .start();

Мои вопросы:

  • какое значение альфы фактически повлияет на количество итераций? (Я думал, что это имелось в виду с " * Если значение неположительно, и принудительное размещение выполняется, этот метод останавливает принудительное размещение на следующем тике и отправляет "конец" в документации
  • в этой этой публикации @JohnS предлагает функцию, которая, по-видимому, может помочь. Но я не понял, где это надо называть.

PS: еще один классный вариант — иметь изображение на экране, а затем вычислить оптимальный макет в фоновом режиме, как здесь . Но я отказался от попыток реализовать это


person user1043144    schedule 18.06.2013    source источник


Ответы (1)


Один из способов охладить компоновку сил — принудительно настроить события тиков:

var k = 0;
while ((force.alpha() > 1e-2) && (k < 150)) {
    force.tick(),
    k = k + 1;
}

альфа-значение измеряет температуру силы, более низкие значения указывают на то, что компоновка более стабильна. Количество тиков, чтобы считать его стабильным, будет зависеть от количества узлов, у меня были хорошие результаты с 50-200. Коэффициент трения поможет стабилизировать усилие, но компоновка будет менее оптимальной.

person Pablo Navarro    schedule 18.06.2013
comment
превосходно. Спасибо. Я просто скопировал код в конец своего файла, и он отлично работает. P.S: Я также поигрался с трением, но это так, как вы говорите: оно замедляет анимацию, но приводит к странной форме сети. - person user1043144; 19.06.2013
comment
Это может быть немного упрощено while (force.alpha()) { force.tick(); } или while (force.alpha() > 1e-5) { force.tick(); }, если мы хотим контролировать уровень, на котором макет должен прекращать вычисления. - person Pablo Navarro; 26.02.2016